我想调用一个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
有人可以帮助我理解和优化此过程吗? 谢谢
答案 0 :(得分:1)
您要使用AsyncIO。
标准的Python实现具有GIL。这意味着一次只能运行一个线程。这意味着,如果可以帮助,您将不需要任何其他线程。
多年来,python围绕GIL提出了多种解决方案。
其中一个是multiprocessing,另一个是asyncio。由于您正在等待(我假设是网络)API响应,因此您应该看看AsyncIO。