未提交的并发期货职位

时间:2019-08-09 14:52:24

标签: python

我正尝试通过以下示例使用并发期货,但是我的工作从未提交过。在load_url中看不到打印内容。

import sys
from concurrent import futures
import multiprocessing
import time
import queue


def load_url(url,q):
    # it will take 2 seconds to process a URL
    print('load_url')
    try:
        time.sleep(2)
        # put some dummy results in queue
        for x in range(5):
            print('put in queue')
            q.put(x)
    except Exception as e:
        print('exception')


def main():
    print('start')
    manager = multiprocessing.Manager()
    e = manager.Event()
    q = queue.Queue()
    with futures.ProcessPoolExecutor(max_workers=5) as executor:
        livefutures = {executor.submit(load_url, url, q): url
                       for url in ['a','b']}
        runningfutures = True
        print('check_futures')
        while runningfutures:
            print('here')
            runningfutures = [f for f in livefutures if f.running()]
            if not runningfutures:
                print('not running futures == ', q.empty())
                while not q.empty():
                    print('not running futures1')
                    yield q.get(False)


if __name__ == '__main__':
    for x in main():
        print('x=',x)

2 个答案:

答案 0 :(得分:0)

可能有点晚了,但我刚看到你的帖子。 ProcessPoolExecutor 有点挑剔,它需要执行简单的功能,有时在 Windows 和 Linux 上的行为也不同。 ThreadPoolExecutor 更为宽松。 如果你用 futures.ThreadPoolExecutor 替换 futures.ProcessPoolExecutor 它似乎工作。

答案 1 :(得分:0)

您将 python 的标准队列传递给异步进程,而不是多处理安全的队列实现。因此,您的异步作业失败了:TypeError: cannot pickle '_thread.lock' object。但是,因为您没有在未来对象上调用 .result - 主进程中永远不会引发此异常。

使用 manager.Queue() 实例化您的队列并且代码有效。