Пул потоков, который сообщает мне, когда хотя бы 1 закончил? - PullRequest
2 голосов
/ 04 августа 2010

Мне нужно использовать пул потоков в Python, и я хочу знать, когда закончился хотя бы 1 выход или «максимально допустимые потоки», поэтому я могу запустить его снова, если мне все еще нужно что-то делать.

Я использовал что-то вроде этого:

def doSomethingWith(dataforthread):
    dostuff()
    i = i-1 #thread has finished

i = 0
poolSize = 5
threads = []
data = #array of data
while len(data):
    while True:
        if i<poolSize: #if started threads is < poolSize start new thread
            dataforthread = data.pop(0)
            i = i+1
            thread = doSomethingWith(dataforthread)
            thread.start()
            threads.append(thread)
        else:
            break
    for t in threads: #wait for ALL threads (I ONLY WANT TO WAIT FOR 1 [any])
        t.join()

Как я понимаю, мой код открывает 5 потоков, а затем ожидает завершения всех потоков, прежде чем начинать новые потоки, пока данные не будут использованы. Но я действительно хочу запустить новый поток, как только один из потоков завершит работу, и в пуле будет «доступное место» для нового потока.

Я читал это , но я думаю, что это будет иметь ту же проблему, что и мой код (не уверен, я новичок в python, но, глядя на joinAll (), это выглядит так).

Есть ли у кого-нибудь пример, чтобы сделать то, что я пытаюсь достичь?

Я имею в виду обнаружение, как только я <, чем poolSize, запуск новых потоков до i = poolSize и выполнение этого до тех пор, пока данные не будут использованы. </p>

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Как отмечает автор статьи и подчеркивает @getekha, пулы потоков в Python не выполняют в точности то же самое, что и в других языках.Если вам нужен параллелизм, вам следует заглянуть в модуль multiprocessing .Среди прочего, он имеет удобные конструкции Queue и Pool.Также есть принятый PEP для «фьючерсов» , который вы, вероятно, захотите отслеживать.

1 голос
/ 04 августа 2010

Проблема в том, что в Python есть глобальная блокировка интерпретатора, которую нужно удерживать для запуска любого кода Python. Это означает, что только один поток может выполнять код Python в любое время, поэтому пулы потоков в Python не такие, как в других языках. Это в основном по непонятным причинам, известным лишь немногим избранным (то есть это сложно).

Если вы действительно хотите выполнять код асинхронно, вы должны создавать новые процессы; multiprocesssing модуль имеет класс Pool, который вы можете посмотреть.

...