我正尝试通过以下示例使用并发期货,但是我的工作从未提交过。在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)
答案 0 :(得分:0)
可能有点晚了,但我刚看到你的帖子。 ProcessPoolExecutor 有点挑剔,它需要执行简单的功能,有时在 Windows 和 Linux 上的行为也不同。 ThreadPoolExecutor 更为宽松。 如果你用 futures.ThreadPoolExecutor 替换 futures.ProcessPoolExecutor 它似乎工作。
答案 1 :(得分:0)
您将 python 的标准队列传递给异步进程,而不是多处理安全的队列实现。因此,您的异步作业失败了:TypeError: cannot pickle '_thread.lock' object
。但是,因为您没有在未来对象上调用 .result
- 主进程中永远不会引发此异常。
使用 manager.Queue()
实例化您的队列并且代码有效。