Python 未提交并发作业
我试图使用下面的例子来使用并发期货,但我的工作从未提交。在加载url中看不到打印stmtPython 未提交并发作业,python,Python,我试图使用下面的例子来使用并发期货,但我的工作从未提交。在加载url中看不到打印stmt 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.sl
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)
可能有点晚了,但我刚看到你的帖子。 ProcessPoolExecutor有点挑剔,它需要踏板来执行简单的函数,有时在Windows和Linux上的行为也不同。 ThreadPoolExecutor的权限更大。
如果你用futures.ThreadPoolExecutor替换futures.ProcessPoolExecutor,它似乎可以工作。可能有点晚了,但我刚刚看到你的帖子。 ProcessPoolExecutor有点挑剔,它需要踏板来执行简单的函数,有时在Windows和Linux上的行为也不同。 ThreadPoolExecutor的权限更大。
如果将futures.ProcessPoolExecutor替换为futures.ThreadPoolExecutor,它似乎可以工作。您将python的标准队列传递给异步进程,而不是多处理安全队列实现。因此,异步作业失败,原因是:
TypeError:cannot pickle'\u thread.lock'对象
。但是,由于您没有对future对象调用.result
,因此在主进程中不会引发此异常
使用
manager.queue()
实例化队列,代码就会工作。将python的标准队列传递给异步进程,而不是多处理安全队列实现。因此,异步作业失败,原因是:TypeError:cannot pickle'\u thread.lock'对象
。但是,由于您没有对future对象调用.result
,因此在主进程中不会引发此异常
使用manager.queue()
实例化您的队列,代码就会生效