使用Twisted实现简单的非网络并发
我在用Twisted处理Python中的简单并发时遇到了问题。问题是——我不知道该怎么做,而且网上的资料大多都是关于Twisted的网络功能。所以我来向StackOverflow的高手们请教一些指导。
我使用的是Python 2.5。
我问题的简化版本如下:
- 一堆科学数据
- 一个处理这些数据并生成输出的函数
- ??? < 这里就涉及到并发,它从1中获取数据块,并把它们送到2
- 来自3的输出被合并并存储
我猜想Twisted的reactor
可以完成第三步的工作。但是,怎么做呢?
非常感谢任何帮助和建议。
更新1:
简单的示例代码。我不知道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
4 个回答
要真正实现并发计算,你可能需要使用多个Python进程。一个单独的Python进程可以交替进行计算,但它不会同时执行这些计算(有一些例外情况)。
Twisted是一个很好的工具,可以帮助你协调这些多个进程并收集它们的结果。有一个专门为解决这个问题而设计的库叫做Ampoule。你可以在它的Launchpad页面上找到更多关于Ampoule的信息:https://launchpad.net/ampoule。
正如Jean-Paul所说,Twisted非常适合协调多个进程。不过,如果你并不一定需要使用Twisted,只是想要一个分布式处理池,那么可能还有其他更合适的工具。
我想到的一个工具是Celery。Celery是一个分布式任务队列——你可以设置一个任务队列,使用数据库、Redis或RabbitMQ(可以选择多种免费的软件选项),然后编写一些计算任务。这些任务可以是任何科学计算类型的任务。任务还可以生成子任务(实现你上面提到的“合并”步骤)。然后你可以根据需要启动多个工作进程,进行计算。
我自己经常使用Twisted和Celery,所以无论如何,这两种选择都是不错的。
看起来你对Twisted的基本工作原理有些误解。我建议你去看看Twisted入门,这是Dave Peticolas写的。这对我帮助很大,我已经使用Twisted好多年了!
提示:Twisted中的一切都依赖于反应器!
(来源: krondo.com)