使用Twisted进行简单的非网络并发

时间:2010-03-29 16:31:27

标签: python concurrency twisted

我在使用Twisted在python中进行简单并发时遇到问题。问题是 - 我不知道该怎么做,所有在线资源都是关于Twisted网络能力的。所以我转向SO-gurus寻求指导。

使用Python 2.5。

我的问题的简化版本运行如下:

  1. 一堆科学数据
  2. 一种能够控制数据并创建输出的功能
  3. ??? <这里输入并发,它从 1 获取大量数据并将其提供给 2
  4. 3 的输出已加入并存储
  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
    

4 个答案:

答案 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 IntroDave Peticolas一个镜头。这对我很有帮助,我已经使用Twisted多年了!

提示:Twisted中的所有内容都依赖于reactor

The Reactor Loop http://krondo.com/blog/wp-content/uploads/2009/07/reactor-1.png