python有GIL(全局解释器锁)的限制,虽然Python解释器可以运行多个线程,但只有一个线程在解释器中运行。Python多线程相当于单核多线程。
如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。但python可以通过多进程实现多核任务,多个Python进程有各自独立的GIL锁,互不影响。但是进程间通信相对比较麻烦,需要使用IPC机制(管道、套接字等)。
当python调用C扩展的时候,可以在C扩展中把GIL释放掉,从而达到使用多线程并行的目的。
GIL会在I/O调用(会调用内建的操作系统C代码)之前被释放,以允许其他线程在这个线程等待I/O的时候运行。I/O密集型的Python程序比计算密集型的Python程序更能充分利用多线程的好处。
我们可以把一些计算密集型任务用C语言编写,然后把.so链接库内容加载到Python中,因为执行C代码,GIL锁会释放,这样一来,就可以做到每个核都跑一个线程的目的。
参考资料:python 多线程