Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候在Python中使用线程?_Python_Python 3.x - Fatal编程技术网

什么时候在Python中使用线程?

什么时候在Python中使用线程?,python,python-3.x,Python,Python 3.x,有人告诉我,由于GIL,在Python中使用线程不是一个好的实践。我认为创建线程的开销只会降低速度,最终使其比单线程应用程序慢。 那么,为什么Python首先会有线程库呢?什么时候应该使用线程 (我假设Python3)GIL不是python本身的问题,而是它的cpython实现的问题,因为cpython实现中的内存管理不是线程安全的 Cpython是通过python解释器上的全局锁实现的。因此,一个特定的python CPU绑定操作可以在特定的时间在特定的解释器上运行。因此,无论您运行的是单线程

有人告诉我,由于GIL,在Python中使用线程不是一个好的实践。我认为创建线程的开销只会降低速度,最终使其比单线程应用程序慢。 那么,为什么Python首先会有线程库呢?什么时候应该使用线程


(我假设Python3)

GIL
不是python本身的问题,而是它的
cpython
实现的问题,因为cpython实现中的内存管理不是线程安全的

Cpython
是通过python解释器上的全局锁实现的。因此,一个特定的python CPU绑定操作可以在特定的时间在特定的解释器上运行。因此,无论您运行的是单线程还是多线程,都是一样的


但是,想象一下,如果有一些I/O绑定的任务,比如数据库查询或文件操作,而python代码实际上没有得到执行,那么使用
多线程
,您将受益匪浅

@kindall在他的评论中给出了答案

多线程不是加速任何处理的神奇工具。这是一种同时在系统中存在多个线程的方法。它可以用于在多个内核上拆分处理,以进行计算绑定处理(由于全局解释器锁,此内核不在CPython中)。但它也可以用于io绑定处理:一个线程运行,而其他线程等待io完成。一个很好的例子是多线程TCP服务器,其中每个线程都可以为不同的客户端连接提供服务。CPython实现在这里很好,因为GIL没有理由阻止已经在io级别被阻止的线程


最后再谈一下一般的多线程:它应该永远不要用于内存绑定的处理…

线程对计算绑定的进程没有帮助。幸运的是,它对I/O绑定的进程(如Web应用程序)有很大帮助。因为我不希望函数在一步一步地运行电机时阻塞,所以我使用另一个线程连续运行电机。