可以在python的每个内核中实现多个线程

时间:2018-08-04 07:39:52

标签: multithreading python-2.7 multiprocessing

我正在用python开发一个应用程序,其中我可以使用multithreadingmultiproceccing,但是我需要连接大量设备。有什么办法可以在每个内核中运行多个线程。

如果我有4个核心,那么有没有办法在每个核心中运行2个线程。这样我们就可以运行8个并发线程。

2 个答案:

答案 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。