python 多线程有几种实现方法,python多线程是假的

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: