转自:
https://blog.csdn.net/weixin_38125866/article/details/76795462
https://www.cnblogs.com/lcchuguo/p/4687348.html
Python GIL(Global Interpreter Lock)
GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。
有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。
像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。
所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL
python3的线程启动支持两种方式:
一种是以传入函数名开启;
另一种是通过重写run方法开启;
以传入函数名开启:
import time import threading def demo(n): while n >= 0: print("n:", n) n -= 1 time.sleep(1) if __name__=='__main__': t = threading.Thread(target=demo, args=(10,)) t.start() t.join() print("exit")
重写run方法:
import time import threading class A(threading.Thread): def __init__(self, args): threading.Thread.__init__(self) self.args = args def run(self): n = self.args while n > 0: print("n:", n) n -= 1 time.sleep(1) if __name__=='__main__': t = A(10) t.start() t.join() print("exit")
创建后台线程:
t = threading.Thread(target=demo, args=(20,), daemon=True)
t.start()
------------------------------------------------------------
创建后台线程:
def f0(): pass def f1(a1,a2): time.sleep(5) f0() '''下面代码是直接运行下去的,不会等待函数里面设定的sleep''' t= threading.Thread(target=f1,args=(111,112))#创建线程 t.setDaemon(True)#设置为后台线程,这里默认是False,设置为True之后则主线程不用等待子线程 t.start()#开启线程
import time import threading def run(n): print('[%s]------running----\n' % n) time.sleep(2) print('--done--') def thread1(): print('starting thread: %s' % threading.current_thread().getName()) for i in range(5): t = threading.Thread(target=run, args=[i, ]) t.start() t.join(1) print("start thread %s" % threading.current_thread().getName()) m = threading.Thread(target=thread1, args=(), name="thread1") m.setDaemon(True) # thread1,它做为程序主线程的守护线程,当主线程退出时,thread1线程也会退出,由thread1启动的其它子线程会同时退出,不管是否执行完任务 m.start() m.join(timeout=2) print("---main thread done----")#主线程退出
Note:Daemon threads are abruptly stopped at shutdown. Their resources (such as open files, database transactions, etc.) may not be released properly.
If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as anEvent
.
import time import threading class DownThread: def __init__(self): self._running = True def terminate(self): self._running = False def run(self, n): while self._running and n > 0: print('T-minus', n) n -= 1 time.sleep(1) if __name__=='__main__': c = DownThread() t = threading.Thread(target=c.run, args=(10,)) t.start() time.sleep(3) c.terminate() t.join()
Python多线程里面的event方法实现线程间通信
Python 通过threading.Event()产生一个event对象。Event默认内置了一个标志,初始值为False,通过set()将其置为True。wait(timeout)则用于堵塞线程直至Flag被set(或者超时,可选的),isSet()用于查询标志位是否为True,
Clear()则用于清除标志位(使之为False)。
当Event对象的内部信号标志为False时。wait方法一直堵塞线程等待到其为真或者超时(若提供,浮点数,单位为秒)才返回,若Event对象内部标志为True则wait()方法马上返回。
def do(event): print('start') event.wait() print('end') if __name__ == "__main__": event_obj = threading.Event() # 创建一个事件 event_obj.clear() t1 = threading.Thread(target=do, args=(event_obj,)) t1.start() data = input('请输入要:') if data == 'True': event_obj.set() # 变绿灯 time.sleep(5)