使用Twisted实现简单的非网络并发

4 投票
4 回答
1147 浏览
提问于 2025-04-15 20:59

我在用Twisted处理Python中的简单并发时遇到了问题。问题是——我不知道该怎么做,而且网上的资料大多都是关于Twisted的网络功能。所以我来向StackOverflow的高手们请教一些指导。

我使用的是Python 2.5。

我问题的简化版本如下:

  1. 一堆科学数据
  2. 一个处理这些数据并生成输出的函数
  3. ??? < 这里就涉及到并发,它从1中获取数据块,并把它们送到2
  4. 来自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 个回答

3

要真正实现并发计算,你可能需要使用多个Python进程。一个单独的Python进程可以交替进行计算,但它不会同时执行这些计算(有一些例外情况)。

Twisted是一个很好的工具,可以帮助你协调这些多个进程并收集它们的结果。有一个专门为解决这个问题而设计的库叫做Ampoule。你可以在它的Launchpad页面上找到更多关于Ampoule的信息:https://launchpad.net/ampoule

4

正如Jean-Paul所说,Twisted非常适合协调多个进程。不过,如果你并不一定需要使用Twisted,只是想要一个分布式处理池,那么可能还有其他更合适的工具。

我想到的一个工具是Celery。Celery是一个分布式任务队列——你可以设置一个任务队列,使用数据库、Redis或RabbitMQ(可以选择多种免费的软件选项),然后编写一些计算任务。这些任务可以是任何科学计算类型的任务。任务还可以生成子任务(实现你上面提到的“合并”步骤)。然后你可以根据需要启动多个工作进程,进行计算。

我自己经常使用Twisted和Celery,所以无论如何,这两种选择都是不错的。

1

看起来你对Twisted的基本工作原理有些误解。我建议你去看看Twisted入门,这是Dave Peticolas写的。这对我帮助很大,我已经使用Twisted好多年了!

提示:Twisted中的一切都依赖于反应器

反应器循环
(来源: krondo.com)

撰写回答