带有I / O的Python Multiproccess

时间:2017-07-14 02:59:16

标签: python multiprocessing

所以我有一个连续运行的python脚本,可以发送消息。它接收消息的内容并在几个API上运行搜索,然后使用该搜索的结果进行回复。目前我正在使用async / await,这是迄今为止的工作,但是如果它在已经处理一个消息时收到消息,它将等到它完成之前它正在搜索的消息,然后才开始收到一个。

我希望设置它以便它可以一次处理多个消息,因为大多数等待都在等待API响应。多处理是我应该在这里使用的,如果是这样,我有一种方法让多处理功能只是闲置,直到添加消息,然后将该消息发送到多处理功能。看起来我应该使用一个队列,但大多数文档说,一旦没有其他工作,队列就会关闭。有一件事是必要的,如果我有一定数量的进程工作(例如4个进程)并且我有> 4条消息,它会存储额外的消息,并将它们添加到下一个被释放的进程中。

像这样:(非常糟糕的伪代码)

def runOnMessageReceive(message)
    <run a regex here and extract the text i want to search for>
    addToSearchQueue(text)

def addToSearchQueue(text)
    <here is where it would add it to the waiting queue and run it when it has an 
    open process>
    process.run(searchAndPrint(text))

def searchAndPrint(info):
    reply = Module.searchOnlineAPI(info)
    Module.replyToMessage(reply)

由于

1 个答案:

答案 0 :(得分:0)

您应该尝试确切地找到“阻塞”的内容。 asyncio正是您想要的,避免在等待另一个时阻止挂起的任务。多处理或多线程似乎不是这里的方法。对于这种用例,正确使用asyncio将比任何多处理都要好一个数量级。如果有什么东西挂起,你要么误用asyncio(例如调用阻塞函数),要么你受到消息队列的QoS限制(这可能是可配置的)。