Bonky
Neither believe nor reject anything, because any other person has rejected or believed it. Heaven has given you a mind for judging truth and error, Use it.
By Thomas Jefferson

Python 多线程

进程和线程

转自廖雪峰教程:https://www.liaoxuefeng.com/wiki/897692888725344/923056118147584

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。

偶然发现,发现 Mac 系统最多一个进程开启2048个线程,超过则会报错:thread.error: can’t start new thread。原因是一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈 StackSize 为1M,这样当线程数量为2048时,2048M=2G,内存资源就相当于耗尽

GIL

在跑 Python 多线程程序的时候,发现怎么也跑不满所有的核。(如我八核,最多也才400%多的使用率)

屏幕快照 2019-08-13 下午2.52.33

c++可以跑满所有的核,这是因为Python 解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。如果想要充分利用多核,那么则需要使用多个进程。

在多线程的环境中,Python虚拟机按一下方式执行:

  (1)设置GIL

  (2)切换到一个线程执行

  (3)运行:指定数量的字节码指令、线程主动让出控制

  (4)把线程设置为睡眠状态

  (5)解锁GIL

  (6)再次重复以上步骤。

所以,I/O密集型Python程序比计算密集型的程序更能充分利用多线程的好处。 在计算密集型的程序中不要Python多线程,使用Python多进程进行并发编程,就不会有GIL这种问题存在,并且也能充分利用多核cpu。

ps: 使用 pypy 反而效率比 CPython 还低?

屏幕快照 2019-08-13 下午3.31.22

Threadpool – 线程池

引用:https://www.cnblogs.com/xinxindiandeng/p/6383311.html

操作系统创建线程、切换线程状态、终结线程都要进行CPU调度——这是一个耗费时间和系统资源的事情。

大多数实际场景中是这样的:处理某一次请求的时间是非常短暂的,但是请求数量是巨大的。这种技术背景下,如果我们为每一个请求都单独创建一个线程,那么物理机的所有资源基本上都被操作系统创建线程、切换线程状态、销毁线程这些操作所占用,用于业务请求处理的资源反而减少了。所以最理想的处理方式是,将处理请求的线程数量控制在一个范围,既保证后续的请求不会等待太长时间,又保证物理机将足够的资源用于请求处理本身。

另外,一些操作系统是有最大线程数量限制的。当运行的线程数量逼近这个值的时候,操作系统会变得不稳定。这也是我们要限制线程数量的原因。

一般使用线程池的方法如下

第一行的意思是创建一个可存放poolsize个数目的线程的线程池。

第二行的意思是调用makeRequests创建请求。 some_callable是需要开启多线程处理的函数,list_of_args是函数参数,callback是可选参数回调,默认是无。

第三行的意思是把运行多线程的函数放入线程池中。

最后一行的意思是等待所有的线程完成工作后退出。

补充

发现上面的代码在有些情况下会出现功能不正常的情况,可以尝试下类似以下格式的代码

Share

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注