自定义线程简单示例代码:
import threading
class MyThread(threading.Thread):
def __init__(self,num):
super(MyThread,self).__init__()
self.num = num
def run(self):
print(self.num)
mt = MyThread(3)
mt.start()
守护线程,和查看线程id主线程结束后不管子线程有没有运行完,子线程都全部被结束掉:
执行python xxx.py时,会生成一个进程,这个进程会自动“启用一个线程”,如果在程序中启用线程,或由启用的线程再去启动子线程时(待补充,需查找获取线程id的方法)
import threading
import time
import os
def m(i):
time.sleep(i)
print("m os.getpid()=",i,os.getpid(),os.getppid())
def f(n):
t_list = []
for i in range(n):
t = threading.Thread(target=m,args=(i,))
t.start()
print("f t.getName() = %s, os.getpid() = %s,os.getppid()= %s"%(t.getName(),os.getpid(),os.getppid()))
t_list.append(t)
for t in t_list:
t.join()
if __name__ == "__main__":
t = threading.Thread(target=f,args=(10,))
t.setDaemon(True)
t.start()
print("main t.getName() = %s, os.getpid() = %s,os.getppid()= %s"%(t.getName(),os.getpid(),os.getppid()))
time.sleep(6)
print("main end")
运行结果,可以看到进程Id只有一个,父进程id为pycharm, 父线程为守护线程,父线程结束后,自线程也不再运行。
main t.getName() = Thread-1, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-2, os.getpid() = 452,os.getppid()= 7644 m os.getpid()= 0 452 7644 f t.getName() = Thread-3, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-4, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-5, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-6, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-7, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-8, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-9, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-10, os.getpid() = 452,os.getppid()= 7644 f t.getName() = Thread-11, os.getpid() = 452,os.getppid()= 7644 m os.getpid()= 1 452 7644 m os.getpid()= 2 452 7644 m os.getpid()= 3 452 7644 m os.getpid()= 4 452 7644 m os.getpid()= 5 452 7644 main end
C:WINDOWSsystem32>tasklist|find "7644"
pycharm.exe 7644 Console 1 756,268 K
C:WINDOWSsystem32>tasklist|find "452"
360chrome.exe 3068 Console 1 20,452 K
python.exe 452 Console 1 10,200 K
Event.
event = threading.Event()
event.set() # 设置event
event.wait() #event.isSet()为False时阻塞
event.clear() #清除event.set()
event.isSet() #判断event是否设置
信号量,同时只允许指定量的线程运行。
import time,threading
def a(i):
s.acquire()
print("begin: ",i,time.time())
time.sleep(i)
print("end: ",i,time.time())
s.release()
if __name__ == "__main__":
s = threading.BoundedSemaphore(5)
t_list = []
for i in range(10):
t = threading.Thread(target=a,args=(i,))
t.start()
t_list.append(t)
for t in t_list:
t.join()
运行结果:
1 begin: 0 1466304270.705245 2 end: 0 1466304270.705245 3 begin: 1 1466304270.7061803 4 begin: 2 1466304270.7061803 5 begin: 3 1466304270.7061803 6 begin: 4 1466304270.7061803 7 begin: 5 1466304270.7061803 8 end: 1 1466304271.7072382 9 begin: 6 1466304271.7072382 10 end: 2 1466304272.7068274 11 begin: 7 1466304272.7068274 12 end: 3 1466304273.7075586 13 begin: 8 1466304273.707777 14 end: 4 1466304274.7071354 15 begin: 9 1466304274.7071354 16 end: 5 1466304275.7078736 17 end: 6 1466304277.7078269 18 end: 7 1466304279.7079546 19 end: 8 1466304281.7093537 20 end: 9 1466304283.7077909
可以看到1结束后,6马上运行