多处理队列与池

时间:2018-02-23 01:32:34

标签: python python-3.x multiprocessing

我正在努力弄清楚multiprocessing.Poolmultiprocessing.Queue之间的使用差异。

为了提供帮助,这段代码是我正在努力做的准系统示例。

def update():
    def _hold(url):
        soup = BeautifulSoup(url)
        return soup
    def _queue(url):
        soup = BeautifulSoup(url)
        li = [l for l in soup.find('li')]
        return True if li else False

    url = 'www.ur_url_here.org'
    _hold(url)
    _queue(url)

我正在尝试同时运行_hold()_queue()。我不是想让他们彼此沟通,所以不需要Pipe。每5秒调用update()

我无法真正理解创建工作池或创建函数队列之间的区别。任何人都可以帮助我吗?

真正的_hold()_queue()函数比示例更精细,因此并发执行实际上是必要的,我只是认为这个例子足以提出问题。

1 个答案:

答案 0 :(得分:5)

PoolQueue属于两个不同的抽象层次。

工作池是一个并发设计范例,旨在抽象出在使用进程和队列时需要自己实现的许多逻辑。

multiprocessing.Pool实际上在内部使用Queue进行操作。

如果问题很简单,您可以轻松地依赖Pool。在更复杂的情况下,您可能需要自己处理进程和队列。

对于您的具体示例,以下代码应该可以解决问题。

def hold(url):
    ...
    return soup

def queue(url):
    ...
    return bool(li)

def update(url):
    with multiprocessing.Pool(2) as pool:
        hold_job = pool.apply_async(hold, args=[url])
        queue_job = pool.apply_async(queue, args=[url])

        # block until hold_job is done
        soup = hold_job.get()
        # block until queue_job is done
        li = queue_job.get()

我还建议您查看concurrent.futures模块。正如其名称所暗示的那样,这是Python中工人池范式的未来证明实现。

您可以轻松地使用该库重新编写上面的示例,因为实际更改的只是API名称。