相比Java,python简单很多,一个例子就可以理解
###########################
有两种创建线程的方式,第一种是直接建立线程,把方法放进去,这是第一种:
创建线程对象,参数设置要执行的方法以及方法的参数,然后执行start()方法,如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import threading 2 import time 3 4 def foo(n): 5 print('foo%s'%n) 6 time.sleep(1) 7 print('foo end') 8 9 def bar(n): 10 print('bar%s'%n) 11 time.sleep(2) 12 print('bar end') 13 14 begin = time.time() 15 16 t1 = threading.Thread(target=foo,args=(1,)) # 创建线程对象,target是某个方法的地址,args是实参 17 t2 = threading.Thread(target=bar,args=(2,)) 18 19 t1.start() # 开启线程对象 20 t2.start() 21 print('main') 22 23 end = time.time() 24 print(end - begin)
运行结果:
GIL:cpython解释器只能使用一个cpu,cpython里面会自动加个大锁,就是python不能够使用多核,不能发挥多核的作用
改进方案就是使用多进程,/笑哭,或者运用到多计算和多I/O的,使用c语言
开子进程是复制父进程的资源,十分消耗资源,所以难搞
################
t.join()方法,可以阻塞住进程,一定要等t这个线程对象的线程运行完成才能继续执行后面的代码
##############################################
##守护线程Damen
t.setDaemon(True)设置成True后,主线程结束它就会结束
#####
threading.current_thread() # 拿到这个执行线程的名字
threading.active_count() # 活跃的线程
##############
第二种创建线程的方式:继承线程类,覆盖run方法,然后创建对象,执行start()方法,就可以执行这个线程了,该线程执行的代码就是run里面的代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import threading import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) # 注意这个构造方法 self.num = num def run(self):#定义每个线程要运行的函数 print('runningonnumber:%s'%self.num) time.sleep(3) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
两个另外的例子:
# 01 要多线程执行的方法作为参数创建线程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import threading import time class Person_thread: def __init__(self,name): self.pname = name def show(self): for i in range(100): print(self.pname,'*******',threading.current_thread(),'--------',i) time.sleep(0.00001) if __name__ == '__main__': p1 = Person_thread('xxx') p2 = Person_thread('qqq') t1 = threading.Thread(target=p1.show) t2 = threading.Thread(target=p2.show) t1.start() t2.start()
# 02 继承threading.Thread类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import threading import time class Person_thread(threading.Thread): def __init__(self,name): threading.Thread.__init__(self) self.pname = name def show(self): for i in range(100): print(self.pname,'*******',self.name,'--------',i) time.sleep(0.00001) def run(self): self.show() if __name__ == '__main__': p1 = Person_thread('xxx') p2 = Person_thread('qqq') p1.start() p2.start()