转自:
https://blog.csdn.net/weixin_38125866/article/details/76795462
https://www.cnblogs.com/lcchuguo/p/4687348.html
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 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)