我正在努力弄清楚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)
我正在尝试同时运行_hold()
和_queue()
。我不是想让他们彼此沟通,所以不需要Pipe
。每5秒调用update()
。
我无法真正理解创建工作池或创建函数队列之间的区别。任何人都可以帮助我吗?
真正的_hold()
和_queue()
函数比示例更精细,因此并发执行实际上是必要的,我只是认为这个例子足以提出问题。
答案 0 :(得分:5)
Pool
和Queue
属于两个不同的抽象层次。
工作池是一个并发设计范例,旨在抽象出在使用进程和队列时需要自己实现的许多逻辑。
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名称。