python 多线程有几种实现方法,python多线程是假的
仅用于研究参考。
多线程共享全局变量#coding=utf-8
从线程导入线程
导入时间
g _编号=100
定义工作1():
全局编号
对于范围(3)中的I:
g_num=1
打印(-在work1中,g_num是%d - %g_num)
定义工作2():
全局编号
打印(-在work2中,g_num是%d - %g_num)
打印(-g _ num在线程创建前是% d- % g _ num)
t1=线程(目标=工作1)
t1.start()
#延迟一段时间,以确保t1线程中的事情完成
时间.睡眠(1)
t2=线程(目标=工作2)
T2.start()执行如下:
[root @ server 01 many _ task]# python test 5 . py
-g _ numis100在创建线程之前-
-在work1中,g_num是103 -
-在work2中,g_num是103 -
[root@server01 many_task]#从上面两个线程的结果来看,线程t1将g_num加到103,它也在线程t2中打印g_num=103。所以对于两个线程来说,全局变量g_num是共享的。
列表作为参数#coding=utf-8传递给线程。
从线程导入线程
导入时间
定义工作1(数量):
nums.append(44)
打印(-在工作1 -,数字)
定义工时2(数量):
#延迟一段时间,以确保t1线程中的事情完成
时间.睡眠(1)
打印(-工作中2 -,数字)
g_nums=[11,22,33]
t1=线程(target=work1,args=(g_nums,))
t1.start()
t2=线程(target=work2,args=(g_nums,))
T2.start()运行如下:
[root @ server 01 many _ task]# python test 6 . py
(-在工作1 -,[11,22,33,44])
(-在工作2 -,[11,22,33,44])
总结:
一个进程中的所有线程共享全局变量,因此在多个线程之间共享数据很方便。
缺点是线程任意修改全局变量,可能会导致多个线程之间的全局变量混淆(即线程不安全)。
多线程共享全局变量问题
多线程开发中可能遇到的问题
假设线程t1和t2都要给全局变量g_num加1(默认值为0),t1和t2各给g_num加10次,g_num的最终结果应该是20。
但是,由于多个线程同时运行,可能会出现以下情况:
在g_num=0时,t1获得g_num=0。此时,系统将t1调度到“睡眠”状态,将t2改为“运行”状态,t2也得到g_num=0。然后t2将得到的值加1,赋给g_num,这样g_num=1。然后,系统将t2调度为“睡眠”,并将t1更改为“运行”。T1在之前的0上加1,赋给g_num。
因此,虽然t1和t2都将g_num加1,但结果仍然是g_num=1。
按如下方式编写代码测试:
[root @ server 01 many _ task]# vim test 4 . py
#编码=utf-8
导入线程
从时间导入睡眠,ctime
#初始化g _编号
g_num=0
def add_func1(数量):
全局编号
对于范围内的I(数量):
g_num=1
Print(add_func1,对于%d次,g_num等于%d% (i,g_num))
#睡眠(0.5)
def add_func2(数量):
全局编号
对于范围内的I(数量):
g_num=1
Print(add_func2,对于%d次,g_num等于%d% (i,g_num))
#睡眠(0.5)
def main():
#执行线程
t1=线程。Thread(target=add_func1,args=(100,)
t2=线程。Thread(target=add_func2,args=(100,)
t1.start()
t2.start()
#判断线程存在时,等待1秒。
而len(threading.enumerate()) 1:
睡眠(1)
Print(两个线程操作同一个全局变量的最终结果是:% 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
两个线程操作同一个全局变量的最终结果是:200
[root@server01 many_task]#虽然两个线程执行速度很快,但g_num恰好是100 100=200的结果,这是正确的。但是,这个数字很小,所以你可能看不出问题。
测试示例2
[root @ server 01 many _ task]# vim test 7 . py
定义工时1(数量):
全局编号
对于范围内的I(数量):
g_num=1
打印(-在work1中,g_num是%d - %g_num)
定义工时2(数量):
全局编号
对于范围内的I(数量):
g_num=1
打印(-在work2中,g_num是%d - %g_num)
打印(-g _ num在线程创建前是% d- % g _ num)
t1=线程。线程(target=work1,args=(10000000,))
t1.start()
t2=线程。线程(target=work2,args=(10000000,))
t2.start()
而len(threading.enumerate())!=1:
时间.睡眠(1)
Print(两个线程操作同一个全局变量后的最终结果是:% s“% g _ num”)如下运行:
[root @ server 01 many _ task]# python test 7 . py
-线程创建前的g _ numis0
-在work1中,g_num是11977799 -
-在work2中,g_num是19108796 -
两个线程操作同一个全局变量的最终结果是:19108796。
[root@server01 many_task]#正确结果应该是:2000000
结论
如果多个线程同时对同一个全局变量进行操作,就会出现资源竞争,数据结果就会不正确。
关注微信微信官方账号,回复【数据】,Python,PHP,JAVA,web,即可获取Python,PHP,JAVA,前端等视频数据。
来自海洋的渔夫原创作品,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。