我在使用Twisted在python中进行简单并发时遇到问题。问题是 - 我不知道该怎么做,所有在线资源都是关于Twisted网络能力的。所以我转向SO-gurus寻求指导。
使用Python 2.5。
我的问题的简化版本运行如下:
我的猜测是,Twisted reactor
可以完成第三项任务。但是如何?
非常感谢您的帮助和建议。
upd1:
简单的示例代码。不知道reactor怎么处理进程,所以我给它做了虚构的函数:
datum = 'abcdefg'
def dataServer(data):
for char in data:
yield chara
def dataWorker(chara):
return ord(chara)
r = reactor()
NUMBER_OF_PROCESSES_AV = 4
serv = dataserver(datum)
id = 0
result = array(len(datum))
while r.working():
if NUMBER_OF_PROCESSES_AV > 0:
r.addTask(dataWorker(serv.next(), id)
NUMBER_OF_PROCESSES_AV -= 1
id += 1
for pr, id in r.finishedProcesses():
result[id] = pr
答案 0 :(得分:4)
正如Jean-Paul所说,Twisted非常适合协调多个流程。但是,除非您需要使用Twisted,并且只需要一个分布式处理池,否则可能有更适合的工具。
我能想到的是celery。 Celery是一个分布式任务队列 - 您设置一个运行DB,Redis或RabbitMQ的任务队列(您可以从许多自由软件选项中进行选择),并编写许多计算任务。这些可以是任意科学计算类型的任务。任务可以产生子任务(实现您在上面提到的“加入”步骤)。然后,您可以根据需要启动尽可能多的工作人员并进行计算。
我是Twisted和Celery的重度用户,所以无论如何,两种选择都很好。
答案 1 :(得分:3)
要实际同时计算内容,您可能需要使用多个Python进程。单个Python进程可以交错计算,但不会并行执行它们(除了少数例外)。
Twisted是协调这些多个流程并收集结果的好方法。 Ampoule是一个面向解决这一任务的图书馆。您可以在其启动板页面上找到有关安瓿的更多信息:https://launchpad.net/ampoule。
答案 2 :(得分:2)
你需要Twisted吗?
根据您对问题的描述,我会说multiprocessing符合条款。创建许多Process
个对象,这些对象被赋予对单个Queue
实例的引用。让他们开始工作并将结果放在Queue
上。只需使用阻止get()
来读取结果。
答案 3 :(得分:1)
在我看来,你误解了扭曲操作的基本原理。我建议您按Twisted Intro给Dave Peticolas一个镜头。这对我很有帮助,我已经使用Twisted多年了!
提示:Twisted中的所有内容都依赖于reactor!
The Reactor Loop http://krondo.com/blog/wp-content/uploads/2009/07/reactor-1.png