我正在用python开发一个应用程序,其中我可以使用multithreading
和multiproceccing
,但是我需要连接大量设备。有什么办法可以在每个内核中运行多个线程。
如果我有4个核心,那么有没有办法在每个核心中运行2个线程。这样我们就可以运行8个并发线程。
答案 0 :(得分:2)
@huhnmonster的答案基本上是正确的:您想要的是saveas
软件包,而不是multithreading
的软件包。
使用Pool
构造实际上很容易做到:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
您要选择的进程数取决于核心数,每个进程的I / O请求频率以及每个核心一次可以支持的执行线程数。
例如,大多数Intel Core i7处理器具有4个内核,但是有足够的片上寄存器来存储2个进程的上下文并并行执行一些操作。根据经验,您不会因此而获得两倍的执行速度,但是通常会看到25%至30%的加速。因此,如果您在Core i7上运行代码,则一次要运行8个进程。如果您的代码在I / O上阻塞的时间大约是一半(可以使用探查器对此进行估计),那么正确的进程数应该是12-16。进行一些实验即可让您很快找到正确的数字。
答案 1 :(得分:0)
在Python中,由于它使用了所谓的GIL或全局解释器锁,因此无法利用多个线程,这意味着一次只能有一个线程运行Python代码。
如果是IO绑定的,则取决于您的用例线程可能仍然适合您的问题。 Python使用协作式多任务处理,这意味着线程在阻塞时会放弃控制,因此,例如,如果您需要对多个设备执行ping操作以查看它们是否仍在运行,则线程将大大加快程序的速度。
如果您需要真正的并发性,请考虑使用多处理,因为它是基于进程的,并且会产生一个新的Python解释器,因此绕过了GIL。