Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,
threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。
避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突;
其次低级别的thread模块的同步原语很少(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,
没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出。
thread模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而threading模块支持守护线程,守护线程一般是
一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。
multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍(官方链接)
from threading import Thread import time def sayhi(name): time.sleep(2) print(‘%s say hello‘ %name) if __name__ == ‘__main__‘: t=Thread(target=sayhi,args=(‘egon‘,)) t.start() print(‘主线程‘) 执行: 主线程 egon say hello
import threading,time def run(): print("子线程(%s)开始"%(threading.current_thread().name)) # 实现线程功能 print("打印了") time.sleep(2) print("子线程(%s)结束"%(threading.current_thread().name)) if __name__ == ‘__main__‘: # 任何进程默认就会启动一个线程 称为主线程 主线程可以器动新的子线程 # current_thread() #返回当前线程的实例 在哪个线程里面就返回哪个线程的实例 print("主线程(%s)启动"%(threading.current_thread().name)) # 打印当前线程名称 # 01创建子线程 # target=run执行指定代码 # name 是指线程名称 t=threading.Thread(target=run,name="rooTHread") # 线程执行 t.start() print("主线程(%s)结束"%(threading.current_thread().name)) # 打印当前线程名称 执行: 主线程(MainThread)启动 子线程(rooTHread)开始 主线程(MainThread)结束 打印了 子线程(rooTHread)结束
import threading,time aa=100000000000000000000000 def run(): print("子线程(%s)开始"%(threading.current_thread().name)) # 实现线程功能 print("打印了") time.sleep(2) print(aa) print("子线程(%s)结束"%(threading.current_thread().name)) if __name__ == ‘__main__‘: print("主线程(%s)启动"%(threading.current_thread().name)) # 打印当前线程名称 t=threading.Thread(target=run,name="rooTHread") # 线程执行 t.start() # 等待线程结束 t.join() print("主线程(%s)结束"%(threading.current_thread().name)) # 打印当前线程名称 # 主线程(MainThread)启动 # 子线程(rooTHread)开始 # 打印了 # 100000000000000000000000 # 子线程(rooTHread)结束 # 主线程(MainThread)结束
from threading import Thread def run(n): print(11111) print(n) p=Thread(target=run,args=("子线程",)) print("主线程!!!!!") p.start()
使用类来启动多线程
class Mythread(Thread): def __init__(self,aa): super().__init__() # 继承线程 self.aa=aa def run(self): print("111111111") print(self.aa) def run1(self): print("哈哈哈哈哈哈") p=Mythread("子线程") p.start() p.run1()
启动多线程
from threading import Thread def run(n,i): print(n,"个数",i) for i in range(20): print("主线程!!!!!") p=Thread(target=run,args=("子线程",i)) p.start()
启动多线程和多进程
import time,os from multiprocessing import Process from threading import Thread def work(): print(‘hello‘) if __name__ == ‘__main__‘: # 在主进程下开启线程 t = Thread(target=work) t.start() print(‘主线程/主进程‘)
‘‘‘ 打印结果: hello 主线程/主进程 ‘‘‘ # 在主进程下开启子进程 t = Process(target=work) t.start() print(‘主线程/主进程‘)
‘‘‘ 打印结果: 主线程/主进程 hello ‘‘‘
线程和进程pid的比较
import time,os
from multiprocessing import Process
from threading import Thread
def work():
print(‘hello‘,os.getpid())
if __name__ == ‘__main__‘:
#part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
t1=Thread(target=work)
t2=Thread(target=work)
t1.start()
t2.start()
print(‘主线程/主进程pid‘,os.getpid(),"22222222222222222222222222222222222222")
# 执行结果
hello22340
hello22340
主线程 / 主进程pid2234022222222222222222222222222222222222222
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@2")
#part2:开多个进程,每个进程都有不同的pid
p1=Process(target=work)
p2=Process(target=work)
p1.start()
p2.start()
print(‘主线程/主进程pid‘,os.getpid(),"111111111111111111111111111111111111111")
执行结果
主线程/主进程pid 22340 111111111111111111111111111111111111111
hello 20204
hello 14772
开启多个进程和多个线程时间比较
import time,os from multiprocessing import Process from threading import Thread def fun2(n): print("进程/线程-->%s"%n,os.getpid()) if __name__=="__main__": # 进程 star=time.time() print("主进程", os.getpid()) # part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样 for i in range(50): p=Process(target=fun2,args=(i,)) p.start() p.join() t2=time.time()-star print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") # 线程 print("主线程", os.getpid()) # part2:开多个进程,每个进程都有不同的pid st= time.time() for i in range(50): aa= Thread(target=fun2,args=(i,)) aa.start() aa.join() t3=time.time()-st print("进程执行时间为%s----线程执行时间为%s"%(t2,t3)) # 进程执行时间为5.123770236968994----线程执行时间为0.015601158142089844
原文:https://www.cnblogs.com/Sup-to/p/11200420.html