在Python处理中使用的最佳线程数

时间:2018-09-18 16:43:02

标签: python multithreading multiprocessing

我想调用一个API来通过套接字获取一些数据,因此,我有58个并行调用API的线程。理想情况下,我希望它们立即运行所有它们,并且不会给我的计算机造成负担。但是由于某些原因,某些线程被阻塞,我认为基于您的系统调用的线程受到限制。

admin:~$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               58
Model name:          Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
Stepping:            9
CPU MHz:             1434.299
CPU max MHz:         3100.0000
CPU min MHz:         1200.0000
BogoMIPS:            4988.39
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            3072K
NUMA node0 CPU(s):   0-3

我想知道两件事:

  
      
  • 我可以创建多少个不阻塞的线程,或者可以调用的最佳线程数?
  •   
  • 如果我无法运行这58个线程,还有更好的方法吗?
  •   
  • 如果我将多处理替换为多线程,那会有所帮助吗?
  •   

UPDATE 1

在阅读了一些有价值的评论后,我发现我的问题还不够清楚,因此在这里我将尝试将其弄清楚。

我有58种不同的api来输入数据,假设假设,我们有一台服务器,其中安装了摄像头(58个摄像头)。我想单独调用它们以获取每个摄像机的帧,并且希望一次。例如,要获取给定时间戳的所有摄像机帧,我发送HTTP请求并获取图像。问题是,当我运行58个线程时,某些线程运行良好,而某些线程需要大量时间,据我了解,这些线程正在阻塞。如何确保每次通话都需要约0.5秒才能获取一帧(假设获取一帧需要约5秒)

语言:Python3

有人可以帮助我理解和优化此过程吗? 谢谢

1 个答案:

答案 0 :(得分:1)

您要使用AsyncIO


标准的Python实现具有GIL。这意味着一次只能运行一个线程。这意味着,如果可以帮助,您将不需要任何其他线程。

多年来,python围绕GIL提出了多种解决方案。

其中一个是multiprocessing,另一个是asyncio。由于您正在等待(我假设是网络)API响应,因此您应该看看AsyncIO。

  • 多重处理产生新的过程。如果您的程序要进行大量计算,请使用“多处理”模块来并行化您的工作量。
  • 如果您的线程主要在等待IO,那么AsyncIO是您应注意的方向。