多处理队列与池

ase*_*lys 7 python multiprocessing python-3.x

我很难找出multiprocessing.Pool和之间用法的区别multiprocessing.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)
Run Code Online (Sandbox Code Playgroud)

我试图运行_hold(),并_queue()在同一时间。我不是要让他们彼此交流,所以不需要Pipeupdate()每5秒调用一次。

我真的无法说清创建工作者池或创建函数队列之间的区别。谁能帮助我?

实数_hold()_queue()函数比示例要复杂得多,因此实际上并发执行是必要的,我只是以为这个示例足以提出问题。

nox*_*fox 6

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()
Run Code Online (Sandbox Code Playgroud)

我还建议您看一下该concurrent.futures模块。顾名思义,这就是Python中的工人池范式的未来证明实现。

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