1 / 4
文档名称:

浅析Python多线程下的变量问题.doc

格式:doc   大小:74KB   页数:4页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

浅析Python多线程下的变量问题.doc

上传人:ttteee8 2019/5/30 文件大小:74 KB

下载得到文件列表

浅析Python多线程下的变量问题.doc

文档介绍

文档介绍:浅析Python多线程下的变量问题这篇文章主要介绍了Python多线程下的变量问题,由于GIL的存在,Python的多线程编程问题一直是开发者中的热点话题,需要的朋友可以参考下在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦:defprocess_student(name):std=Student(name)#std是局部变量,但是每个函数都要用它,因此必须传进去:do_task_l(std)do_task_2(std)defdo_task_l(std):do_subtask_l(std)do_subtask_2(std)defdo_task_2(std):do_subtask_2(std)dosubtask2(std)每个函数一层一层调用都这么传参数那还得了?用全局变量?也不行,因为每个线程处理不同的Student对象,不能共享。如果用一个全局dict存放所有的Student对象,然后以thread自身作为key获得线程对应的Student对象如何?giobal_dict={}defstd_thread(name):std=Student(name)#把std放到全局变量global_dict中:globaldict[threading・current_thread()]二stddotask1()do_task_2()defdo_task_l():#不传入std,而是根据当前线程查找:std=globaldiet[threading・current_thread()]defdo_task_2():#任何函数都可以查找出当前线程的std变量:std=global_dict[threading・current_thread()]这种方式理论上是可行的,它最大的优点是消除了std对象在每层函数中的传递问题,但是,每个函数获取Std的代码有点丑。有没有更简单的方式?ThreadLocal应运而生,不用查找diet,ThreadLocal帮你自动做这件事:importthreading#创建全局ThreadLocal对象:local_school二threading・local()defprocess_student():print'Hell o,%s(in%s)' %(,threading・current_thread()・name)defprocess_thread(name):#绑定ThreadLocal的student:=nameprocess_student()(target二process_thread,args