Python 未提交并发作业

Python 未提交并发作业,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

我试图使用下面的例子来使用并发期货,但我的工作从未提交。在加载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.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()
实例化您的队列,代码就会生效