2010-07-14 66 views
3

嗨,你能告訴我如何使用線程池 在扭曲使用在不同的線程不同的功能......說蟒蛇絞擰

我有ID x=[1,2,3,4]的列表,其中1,2,...等都是ids(我從數據庫中獲得,每個包含一些磁盤中的python腳本)。

我想要做的是列表

掃描X橫移和運行在不同的線程每個腳本,直到他們完成


感謝名單Calderone的,你的代碼對我幫助很大。

我有幾個疑問,像我可以通過這種方式調整線程池大小。

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

說所有30個可用線程都很忙&仍有一定的ID列表(字典或元組) 1,在這種情況下,所有的IDS會遍歷?我的意思是儘快線程是免費的下一個工具(編號) 將被分配給釋放線程? 2 - 在某些情況下,必須在第二個工具之前執行一個工具&一個工具輸出將被另一個工具使用,它將如何在扭曲的線程中進行管理。 3

回答

14

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() 

你可以閱讀更多有關threading howto在扭曲的線程。