最近做项目要用到多线程,作为菜鸟,对python的多线程不是很了解,在查找了多方面的资料之后稍微有了一点收获,在这里做一下记录,也可以方便遇到同样问题的同学。
对于Python的多线程,首先需要了解GIL(Global Interpreter Lock),下面的这篇内容很不错:
读完上面这篇文章之后你会发现,哦原来Python的多线程用起来是有限制的:
1.对于IO密集型任务,Python的多线程能发挥很好的作用
2.而对于CPU密集型任务,由于GIL的存在,Python的多线程并不能达到想要的效果
对我的项目而言,需要处理的是CPU密集型任务,又必须使用多线程,又不想放弃Python简洁的代码。这种情况下只有两种方案:
1.在Pyhon中通过ctypes加载外部的C的动态链接库:
通过这种方式可以使python代码在执行到ctypes调用C的函数时将GIL释放。我们可以通过一个小程序测试一下:
在VS中创建 ThreadUsedCount.cpp:
#include "stdio.h"
extern "C" __declspec(dllexport) void ThreadUsedCount()
{
int i = 0;
while (1)
{
i += 1;
}
}
之后在Visual Studio command prompt中输入一下命令来生成
ThreadUsedCou
nt.dll:
1.cl /c ThreadUsedCount.cpp
2.link /dll ThreadUsedCount.obj