Multithreading python中的每个核心是否可以实现多个线程

Multithreading python中的每个核心是否可以实现多个线程,multithreading,python-2.7,multiprocessing,Multithreading,Python 2.7,Multiprocessing,我正在用python制作一个应用程序,我可以使用多线程和多线程,但我需要连接大量设备。有没有办法在每个内核中运行多个线程 如果我有4个内核,那么有没有办法在每个内核中运行2个线程。因此,我们可以有8个并发线程运行。在Python中,无法利用多个线程,因为它使用了所谓的GIL或全局解释器锁,这意味着一次只能有一个线程运行Python代码 根据您的用例,如果是IO绑定的,线程仍然可能适合您的问题。Python使用协作多任务,这意味着线程在阻塞时会放弃控制,因此,例如,如果您需要ping多个设备以查看

我正在用python制作一个应用程序,我可以使用
多线程
多线程
,但我需要连接大量设备。有没有办法在每个内核中运行多个线程


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

在Python中,无法利用多个线程,因为它使用了所谓的GIL或全局解释器锁,这意味着一次只能有一个线程运行Python代码

根据您的用例,如果是IO绑定的,线程仍然可能适合您的问题。Python使用协作多任务,这意味着线程在阻塞时会放弃控制,因此,例如,如果您需要ping多个设备以查看它们是否仍在运行,线程将大大加快程序的速度


如果需要真正的并发,考虑使用多进程,因为它是基于进程的,生成一个新的Python解释器,因此在Python中绕过吉尔。

< P>不能使用多个线程,因为它使用一个所谓的吉尔或全局解释器锁,这意味着只有一个线程一次可以运行Python代码。p> 根据您的用例,如果是IO绑定的,线程仍然可能适合您的问题。Python使用协作多任务,这意味着线程在阻塞时会放弃控制,因此,例如,如果您需要ping多个设备以查看它们是否仍在运行,线程将大大加快程序的速度


如果您需要真正的并发性,考虑使用多进程,因为它是基于进程的,生成一个新的Python解释器,因此绕过吉尔。

@ HunMod的答案基本上是正确的:您需要的是包,而不是<代码>多线程< /代码>一个。 使用
构造实际上很容易做到这一点:

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%。因此,如果您在核心i7上运行代码,那么您希望一次运行8个进程。如果您的代码在I/O上阻塞了大约一半的时间(您可以使用探查器来估计),那么正确的进程数应该是12-16。稍微做一点实验就能让你很快找到正确的数字。

@huhnmonster的答案基本上是正确的:你想要的是包,而不是多线程

使用
构造实际上很容易做到这一点:

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%。因此,如果您在核心i7上运行代码,那么您希望一次运行8个进程。如果您的代码在I/O上阻塞了大约一半的时间(您可以使用探查器来估计),那么正确的进程数应该是12-16。稍微做一点实验可以让你很快找到正确的数字。

即使在使用
多处理时
我能同时处理16-17个进程吗?@Candy这实际上取决于你的工作量,如果你需要做一些繁重的数字运算,只要进程数低于或等于你的CPU核心数,你就只能得到加速。如果您只做基于IO的工作,那么线程可能也能工作。另外一个好处是,如果需要的话,您可以使用线程共享内存。即使在使用
多处理
时,我可以同时处理16-17个进程吗?@Candy这实际上取决于您的工作负载,如果你需要做一些繁重的数字运算,只要进程数低于或等于你的CPU核心数,你就只能得到加速。如果您只做基于IO的工作,那么线程可能也能工作。另外一个好处是,如果需要的话,可以使用线程共享内存。