витая нить - PullRequest
       3

витая нить

3 голосов
/ 14 июля 2010

Привет, подскажите, пожалуйста, как использовать разные функции в разных потоках с помощью пула потоков. в скрученном ... скажем

У меня есть список идентификаторов x=[1,2,3,4], где 1,2, ... и т. Д. Идентификаторы (я получил из базы данных, и каждый из них содержит скрипт Python в некоторых где диск).

что я хочу сделать, это

проверка x traverse в списке и запуск каждого скрипта в разных потоках, пока они не завершатся


Спасибо Кальдероне, твой код мне очень помог.

У меня мало сомнений, что я могу таким образом изменить размер пула потоков.

from twisted.internet import reactor
reactor.suggestThreadPoolSize(30)

говорят, что все 30 доступных потоков заняты, и в списке все еще есть некоторые идентификаторы (dict или tuple) 1-В этой ситуации все идентификаторы будут пройдены? Я имею в виду, как только поток свободен следующий инструмент (id) будет назначен на освобожденную тему? 2 - в некоторых случаях один инструмент должен быть выполнен до того, как второй инструмент будет использован, а один выход инструмента будет использован другим инструментом, как это будет осуществляться в витой нити. 3

1 Ответ

14 голосов
/ 14 июля 2010

Темы в Twisted в основном используются через twisted.internet.threads.deferToThread. Кроме того, есть новый интерфейс, который немного более гибкий, twisted.internet.threads.deferToThreadPool. В любом случае, ответ примерно одинаков. Выполните итерацию ваших данных и используйте одну из этих функций для отправки их в поток. Вы получаете Deferred от любого из них, который скажет вам, каков результат, когда он будет доступен.

from twisted.internet.threads import deferToThread
from twisted.internet.defer import gatherResults
from twisted.internet import reactor

def double(n):
    return n * 2

data = [1, 2, 3, 4]

results = []
for datum in data:
    results.append(deferToThread(double, datum))

d = gatherResults(results)
def displayResults(results):
    print 'Doubled data:', results
d.addCallback(displayResults)
d.addCallback(lambda ignored: reactor.stop())

reactor.run()

Подробнее о многопоточности в Twisted вы можете прочитать в threading howto .

...