gpt4 book ai didi

python - 多处理队列与池

转载 作者:太空狗 更新时间:2023-10-29 23:56:58 24 4
gpt4 key购买 nike

我正费尽心思弄清楚 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()。我不想让它们相互通信,因此不需要 Pipeupdate() 每 5 秒调用一次。

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

真正的 _hold()_queue() 函数比例子要复杂得多,所以并发执行实际上是必要的,我只是觉得这个例子足以问这个问题。

最佳答案

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 中工作池范例的 future 证明实现。

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

关于python - 多处理队列与池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48939847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com