lundi 24 juin 2019

How to notify a parent thread of job completion in Python

I would like to use the following code to find a specific number of permutations in a list.

def permutations(ls, prefix, result):
    if ls:
        for i in range(len(ls)):
            permutations([*ls[0:i], *ls[i + 1:]], [*prefix, ls[i]], result)
    else:
        result.append(prefix)

    return result

My issue is that I cannot simply include another parameter to count the number of permutations found. I can't do that because each recursive call to permutations() "splits" into a new "version" (it's like a fork in the road with the old counter and each branch counts its own number of permutations found, not communicating with the others). In other words, this won't work:

def permutations(ls, prefix, result, count, limit):
    if count > limit:
        return 

    if ls:
        for i in range(len(ls)):
            permutations([*ls[0:i], *ls[i + 1:]], [*prefix, ls[i]], result)
    else:
        count += 1
        result.append(prefix)

    return result

So what I would like to do instead of including a count parameter in the function signature, is to notify some other part of my program every time a new permutation is found, and keep track of the count that way. This may be a good use of threading, but I would like to do it without parallelization if possible (or at least the simplest parallelized solution possible).

I realize that I would have to spawn a new thread at each call to permutations([*ls[0:i], *ls[i + 1:]], [*prefix, ls[i]], result) in the for loop.

I'm hoping that someone would be so kind as to point me in the right direction or let me know if there is a better way to do this in Python.

Aucun commentaire:

Enregistrer un commentaire