《Python程序设计》第12章 多线程和多进程_第1页
《Python程序设计》第12章 多线程和多进程_第2页
《Python程序设计》第12章 多线程和多进程_第3页
《Python程序设计》第12章 多线程和多进程_第4页
《Python程序设计》第12章 多线程和多进程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

口令:RAPID708第12章

多线程和多进程学习目标了解多线程和多进程的含义和区别。掌握多进程的相关操作。掌握多线程的相关操作。多线程程序只能从上到下,逐行执行代码,多线程让程序拥有分身效果,能同时处理多件事情。多线程是加速程序运算的有效方法,在Python中多线程操作使用“threading”模块。创建线程importthreadingdefthread_job():print('当前线程个数:%s'%threading.active_count())print('当前线程信息:%s'%threading.current_thread())print('所有线程信息:%s'%threading.enumerate())definit():thread=threading.Thread(target=thread_job)#定义线程thread.start() #启动线程if__name__=='__main__':init()多线程多线程操作时可能会遇到线程抢占的情况。importthreadingimporttimedefthread_job():print("T1start\n")time.sleep(0.1) #延时0.1sprint("T1finish\n")added_thread=threading.Thread(target=thread_job,name='T1')added_thread.start()print("alldone\n")多线程线程等待importthreadingimporttimedefthread1_job():print('T1start\n')time.sleep(1)print('T1finish\n')defthread2_job():print('T2start\n')print('T2finish\n')defmain():thread1=threading.Thread(target=thread1_job,name='T1')thread2=threading.Thread(target=thread2_job,name='T2')thread1.start()thread2.start()thread1.join()#等待线程T1执行完成后,才会继续运行

print('alldone\n')if__name__=='__main__':main()多线程线程存储importthreadingimporttimefromqueueimportQueuedefjob(l,q):foriinrange(len(l)):l[i]=l[i]**2q.put(l) #数据存储definit():q=Queue()threads=[]data=[[1,2,3],[4,5,6],[7,7,7],[8,8,8]]foriinrange(4):#创建4个线程t=threading.Thread(target=job,args=(data[i],q))t.start()threads.append(t)forthreadinthreads:thread.join()results=[]for_inrange(4):results.append(q.get()) #获取数据print(results)if__name__=='__main__':init()多线程使用“join()”方法虽然在一定程度上加强了线程管理,但是线程运行效果依旧很混乱。importthreadingdefjob1():globalAforiinrange(10):#全局变量A循环10次,每次循环加1A+=1print('job1',A)defjob2():globalAforiinrange(10):#全局变量A循环10次,每次循环加10A+=10print('job2',A)if__name__=='__main__':lock=threading.Lock()A=0t1=threading.Thread(target=job1)t2=threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()多线程线程同步importthreadingdefjob1():globalA,locklock.acquire() #内存上锁foriinrange(10):A+=1print('job1',A)lock.release() #内存锁打开defjob2():globalA,locklock.acquire()foriinrange(10):A+=10print('job2',A)lock.release()if__name__=='__main__':lock=threading.Lock() #定义Lock()对象A=0t1=threading.Thread(target=job1)t2=threading.Thread(target=job2)t1.start()t2.start()t1.join()t2.join()多进程多线程是有劣势的,“GIL”(全局解释器锁)让它没能更有效率的处理一些分摊的任务,而现在的电脑大部分配备了多核处理器,多进程可以让电脑更有效率的分配任务给每一个处理器,这种做法有效解决多线程的弊端。importmultiprocessingasmpdefjob():print('job')if__name__=='__main__':p1=mp.Process(target=job)p1.start()p1.join()多进程importmultiprocessingasmpdefjob(q):res=0foriinrange(1000):res+=i+i**2+i**3q.put(res)#将进程运行结果存放到队列中if__name__=='__main__':q=mp.Queue()p1=mp.Process(target=job,args=(q,))#进程1p2=mp.Process(target=job,args=(q,))#进程2p1.start()p2.start()p1.join()p2.join()res1=q.get() #从队列中取出数据res2=q.get()print(res1+res2)进程存储多进程进程池importmultiprocessingasmpdefjob(x):returnx*xdefinit():pool=mp.Pool()res=pool.map(job,range(10))print(res)if__name__=='__main__':init()设置进程池CPU核数definit():pool=mp.Pool(processes=3)#自定义CPU核数量为3res=pool.map(job,range(10))print(res)进程池传单个参数definit():pool=mp.Pool()res=pool.map(job,range(10))print(res)res=pool.apply_async(job,(2,))print(res.get())#获得结果进程池传多个参数definit():pool=mp.Pool()res=pool.map(job,range(10))print(res)res=pool.apply_async(job,(2,))print(res.get())#获得结果

multi_res=[pool.apply_async(job,(i,))foriinrange(10)]#迭代器输入

print([res.get()forresinmulti_res])#迭代输出多进程进程同步importmultiprocessingasmpimporttimedefjob(num1,num2):for_inrange(5):time.sleep(0.1)#延时0.1Snum1.value+=num2#v.value获取共享变量值print(num1.value,end="")definit():num=mp.Value('i',0)#定义共享变量p1=mp.Process(target=job,args=(num,1)) #累加值1p2=mp.Process(target=job,args=(num,3)) #累加值3p1.start()p2.start()p1.join()p2.join()if__name__=='__main__':init()多进程进程锁importmultiprocessingasmpimporttimedefjob(num1,num2,l):l.acquire()#内存锁住for_inrange(5):time.sleep(0.1)num1.value+=num2#获取共享内存print(num1.value)l.release()#内存释放definit():l=mp.Lock(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论