首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以在python中的每个内核中实现多线程吗?

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

Stack Overflow用户
提问于 2018-08-04 15:39:52
回答 2查看 380关注 0票数 0

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-05 01:51:17

@huhnmonster的答案基本上是正确的:您需要的是multiprocessing包,而不是multithreading包。

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

代码语言:javascript
复制
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请求频率以及每个内核一次可以支持的执行线程数。

例如,大多数英特尔酷睿i7处理器有4个内核,但片上寄存器足以存储2个进程的上下文并并行执行一些操作。作为一个经验法则,你不会得到两倍的执行速度,但你经常会看到25-30%的加速。因此,如果你在一个核心i7上运行你的代码,你会希望同时运行8个进程。如果您的代码在I/O上阻塞了大约一半的时间(您可以使用分析器来估计这一点),那么正确的进程数应该是12-16。稍微做一下实验,你就能很快找到正确的数字。

票数 2
EN

Stack Overflow用户

发布于 2018-08-04 19:11:36

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51683545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档