使用工作池

时间:2015-10-28 17:11:51

标签: python redis message-queue publish-subscribe python-multiprocessing

我有一个Redis列表,其中发布者推送了一些消息(JSON序列化)。

另一方面,订阅者可以获取每个JSON blob并执行某些操作。最简单的方法是连续执行此操作。但是我想让它快一点;我想维护一个工作流程池(多个消费者),每当有新消息到达时,检查是否有" free"可以开始处理的池中的进程 我正在寻找以下基于游泳池的版本

while not False:
    _, new_user = conn.blpop('queue:users')
    if not new_user:
        continue
    try:
        process_new_user(new_user, conn)
    except Exception as e:
        print e
    else:
        pass

但是我无法将其转换为使用pythons multiprocessing.Pool类的代码。文档没有帮助

1 个答案:

答案 0 :(得分:0)

from multiprocessing import Pool


pool = Pool()

while 1:
    _, new_user = conn.blpop('queue:users')

    if not new_user:
        continue

    pool.apply_async(process_new_user, args=(new_user, conn))

如果要处理异常,则需要收集AsyncResult返回的pool.apply_async个对象并检查其状态。

如果您可以使用Python 3,concurrent.futures池允许处理异步回调中的结果,从而更容易检查作业退出状态。