线程池和动态变化的工人数量
Posted
技术标签:
【中文标题】线程池和动态变化的工人数量【英文标题】:Threadpool and dynamicly changing number of workers 【发布时间】:2021-01-12 00:41:20 【问题描述】:假设我想实现此代码,但主要区别是:
-
我不知道 max_workers 值是多少。
我的工作人员必须并行工作。
我的工人数量正在动态变化。
我考虑过创建一个工人队列,然后继续将任务推送给可用的工人,但是 我不知道如何做/实施它。 非常感谢。 我希望我的问题很清楚。
import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
def load_url(url, timeout):
with urllib.request.urlopen(url, timeout = timeout) as conn:
return conn.read()
with concurrent.futures.ThreadPoolExecutor(max_workers = 5) as executor:
future_to_url = executor.submit(load_url, url, 60): url for url in URLS
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
【问题讨论】:
你想要扩展工人的规则是什么? 【参考方案1】:您可以将数字或网址除以 10 作为最大工作人员标识符,因为它们的数量会影响您要提交的工作数量:
max_workers = URLS//10
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
...
【讨论】:
感谢您的评论我想我在这里找到了答案docs.python.org/3/library/concurrent.futures.html 在 3.5 版中更改:如果 max_workers 为 None 或未给出,它将默认为机器上的处理器数乘以5、假设ThreadPoolExecutor经常用于重叠I/O而不是CPU工作并且worker的数量应该高于ProcessPoolExecutor的worker数量。以上是关于线程池和动态变化的工人数量的主要内容,如果未能解决你的问题,请参考以下文章