2010-07-14 5 views
3

Salut pouvez-vous s'il vous plaît me dire comment utiliser différentes fonctions dans différents fil à l'aide pool de threads en tordu ... disonspython tordu filetage

J'ai une liste des ids x=[1,2,3,4] où 1,2, ... etc sont ids (j'ai obtenu de la base de données et chacun contient le script de python dans quelque disque d'où).

ce que je veux faire est

balayage de traverse x sur la liste et exécuter chaque script dans différents thread jusqu'à avoir terminé


Thanx Calderone, votre code m'a beaucoup aidé.

J'ai quelques doutes comme je peux redimensionner la taille du pool de threads de cette façon.

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

dire les 30 threads disponibles sont occupés & il y a encore quelques ids dans la liste (dict ou tuple) 1 Dans cette situation, tous les ids seront parcouraient? Je veux dire dès que le fil est libre prochain outil (ID) sera affecté à thread libéré? 2-il y a aussi des cas où un outil doit être exécuté avant que le deuxième outil & soit utilisé par un autre outil, comment sera-t-il géré en fil torsadé. 3

Répondre

14

Les filetages en Twisted sont principalement utilisés via twisted.internet.threads.deferToThread. Alternativement, il y a une nouvelle interface qui est légèrement plus flexible, twisted.internet.threads.deferToThreadPool. De toute façon, la réponse est à peu près la même, cependant. Itérer sur vos données et utiliser l'une de ces fonctions pour l'envoyer à un fil. Vous obtenez un Deferred qui vous dira quel est le résultat, quand il est disponible.

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

Vous pouvez en savoir plus sur le filetage dans Twisted dans le threading howto.