GIL
在Python中,无论是单核还是多核,同时只能由一个线程在执行。其根源是GIL的存在。
GIL的全称是Global Interpreter Lock(全局解释器锁),来源是Python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个Python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。
它是一个互斥锁(或锁),只允许一个线程控制 Python 解释器,在任何时间点都只能有一个线程处于执行状态。
多线程
Python提供两个模块进行多线程的操作,分别是thread
和threading
,前者是比较低级的模块,用于更底层的操作,一般应用级别的开发不常用。
- 方法1:直接使用
threading.Thread()
import threading def run(n): print("current task:", n) if __name__ == "__main__": t1 = threading.Thread(target=run, args=("thread 1",)) t2 = threading.Thread(target=run, args=("thread 2",)) t1.start() t2.start()
- 方法2:继承
threading.Thread
来自定义线程类,重写run
方法import threading class MyThread(threading.Thread): def __init__(self, n): super(MyThread, self).__init__() # 重构run函数必须要写 self.n = n def run(self): print("current task:", n) if __name__ == "__main__": t1 = MyThread("thread 1") t2 = MyThread("thread 2") t1.start() t2.start()
多进程
Python要进行多进程操作,需要用到muiltprocessing
库,其中的Process
类跟threading
模块的Thread
类很相似。所以直接看代码熟悉多进程。
- 方法1:直接使用
Process
, 代码如下:
from multiprocessing import Process
def show(name):
print("Process name is " + name)
if __name__ == "__main__":
proc = Process(target=show, args=('subprocess',))
proc.start()
proc.join()
- 方法2:继承
Process
来自定义进程类,重写run
方法, 代码如下:
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name):
super(MyProcess, self).__init__()
self.name = name
def run(self):
print('process name :' + str(self.name))
time.sleep(1)
if __name__ == '__main__':
for i in range(3):
p = MyProcess(i)
p.start()
for i in range(3):
p.join()