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()在同一时间。我不是要让他们彼此交流,所以不需要Pipe。update()每5秒调用一次。
我真的无法说清创建工作者池或创建函数队列之间的区别。谁能帮助我?
实数_hold()和_queue()函数比示例要复杂得多,因此实际上并发执行是必要的,我只是以为这个示例足以提出问题。
在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()
Run Code Online (Sandbox Code Playgroud)
我还建议您看一下该concurrent.futures模块。顾名思义,这就是Python中的工人池范式的未来证明实现。
您可以轻松地使用该库重新编写上面的示例,因为真正更改的只是API名称。
| 归档时间: |
|
| 查看次数: |
1721 次 |
| 最近记录: |