时间:2021-05-22
多线程-共享全局变量
执行如下:
[root@server01 many_task]# python test5.py
---线程创建之前g_num is 100---
----in work1, g_num is 103---
----in work2, g_num is 103---
[root@server01 many_task]#
从上面两个线程执行的结果来看,线程t1将 g_num 加到 103,在线程t2也是打印g_num=103。所以对于两个线程,g_num这个全局变量是共享的。
列表当做实参传递到线程中
运行如下:
[root@server01 many_task]# python test6.py
('----in work1---', [11, 22, 33, 44])
('----in work2---', [11, 22, 33, 44])
总结:
在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)
多线程-共享全局变量问题
多线程开发可能遇到的问题
假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20。
但是由于是多线程同时操作,有可能出现下面情况:
在g_num=0时,t1取得g_num=0。此时系统把t1调度为”sleeping”状态,把t2转换为”running”状态,t2也获得g_num=0
然后t2对得到的值进行加1并赋给g_num,使得g_num=1
然后系统又把t2调度为”sleeping”,把t1转为”running”。线程t1又把它之前得到的0加1后赋值给g_num。
这样导致虽然t1和t2都对g_num加1,但结果仍然是g_num=1
编写代码测试如下:
[root@server01 many_task]# vim test4.py #coding=utf-8import threadingfrom time import sleep,ctime# 初始化g_numg_num = 0def add_func1(num): global g_num for i in range(num): g_num += 1 print("add_func1,第%d次,g_num等于%d" % (i,g_num)) #sleep(0.5)def add_func2(num): global g_num for i in range(num): g_num += 1 print("add_func2,第%d次,g_num等于%d" % (i,g_num)) #sleep(0.5)def main(): # 执行线程 t1 = threading.Thread(target=add_func1,args=(100,)) t2 = threading.Thread(target=add_func2,args=(100,)) t1.start() t2.start() # 判断当线程存在,则等待1秒 while len(threading.enumerate()) > 1: sleep(1) print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)if __name__ == '__main__': main()执行如下:
add_func2,第96次,g_num等于197
add_func2,第97次,g_num等于198
add_func2,第98次,g_num等于199
add_func2,第99次,g_num等于200
2个线程对同一个全局变量操作之后的最终结果是:200
[root@server01 many_task]#
两个线程虽然执行很快,但是g_num恰好就是100+100=200的结果,是正确的。不过,这个数量少,可能看不出问题来。
测试示例2
[root@server01 many_task]# vim test7.py def work1(num): global g_num for i in range(num): g_num += 1 print("----in work1, g_num is %d---"%g_num)def work2(num): global g_num for i in range(num): g_num += 1 print("----in work2, g_num is %d---"%g_num)print("---线程创建之前g_num is %d---"%g_num)t1 = threading.Thread(target=work1, args=(10000000,))t1.start()t2 = threading.Thread(target=work2, args=(10000000,))t2.start()while len(threading.enumerate()) != 1: time.sleep(1)print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)运行如下:
[root@server01 many_task]# python test7.py
---线程创建之前g_num is 0---
----in work1, g_num is 11977799---
----in work2, g_num is 19108796---
2个线程对同一个全局变量操作之后的最终结果是:19108796
[root@server01 many_task]#
正确的结果应该是:20000000
结论
如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确
到此这篇关于Python 多线程共享变量的实现示例的文章就介绍到这了,更多相关Python 多线程共享变量内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文研究的主要是python使用锁访问共享变量,具体介绍和实现如下。python做多线程编程时,多个线程若同时访问某个变量,可能会对变量数据造成破坏,pyhon
队列queue多应用在多线程应用中,多线程访问共享变量。对于多线程而言,访问共享变量时,队列queue是线程安全的。从queue队列的具体实现中,可以看出que
最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到内存释放问题,导致越累越大1.python类变量在多线程情况下的是共享的2.pyth
python多线程和多进程区别是: 1、多线程可以共享全局变量,而多进程是不能的。 2、多线程中,所有子线程的进程号相同;多进程中不同的子进程进程号不同。
多进程共享变量和获得结果由于工程需求,要使用多线程来跑一个程序。但是因为听说python的多线程是假的,于是使用多进程,反正任务需要共享的参数少。查阅资料,发现