线程池和动态变化的工人数量

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数量。

以上是关于线程池和动态变化的工人数量的主要内容,如果未能解决你的问题,请参考以下文章

jmeter 线程组之间传递动态变化的变量值

动态编程,硬币变化,内存泄漏?

Timeline JS动态标志颜色变化

将相同的队列项分配给多个工作人员

如何将具有动态 ID 的文档保存到 Cloud Firestore?总是在变化

springboot自定义配置文件数量是变化的,属性相同,只是值不一样,怎样绑定到实体类?