python多线程实例_Python多线程实例

前言

感觉理解python多线程用“切换”和“共享”就差不多了。这里就贴上一个抢车票的小小实例,还有自己在编程过程中遇到的坑.....

实例:抢车票

抢车票有三类人:会员、弄了加速包、普通人。

说说区别:

钱带来的不公平:会员先跑,然后加速包,最后普通人

可以欣慰的公平:跑道一样长

守护线程SetDaemon

不设置守护进程

ContractedBlock.gif

ExpandedBlockStart.gif

1 importthreading2 importtime3 #使用函数式

4

5 #会员

6 defvip(t1):7 globalnum8 time.sleep(2) #等待时间相同,区别是进场的先后顺寻

9 if num == 15:10 print("用时:", time.time() -t1)11 exit(0)12 num += 1

13 print('会员,当前被抢票数:', num)14 #有加速包的家伙

15 defaboostOne(t1):16 globalnum17 time.sleep(2) #等待时间相同,区别是进场的先后顺寻

18 if num == 15:19 print("用时:",time.time()-t1)20 exit(0)21 num+=1

22 print('加速包,当前被抢票数:', num)23

24 #没有加速包的苦逼

25 defcommonOne(t1):26 globalnum27 time.sleep(2) #等待时间相同,区别是进场的先后顺寻

28 if num == 15:29 print("用时:", time.time() -t1)30 exit(0)31 num += 1

32 print('苦逼青年,当前被抢票数:', num)33

34 if __name__ =='__main__':35 t1 =time.time() #开始时间

36 num =0 #只有15张票

37 #vip优先,来3个

38 for i in range(3):39 threading.Thread(target=vip,args=(t1,)).start()40 #加速包其次,来7个

41 for i in range(7):42 threading.Thread(target=aboostOne,args=(t1,)).start()43 #苦逼青年最后,来10个

44 for i in range(10):45 threading.Thread(target=commonOne,args=(t1,)).start()

exam1

1473986-20190408224548297-518949098.png

结论:

1.加速包可以抢的比会员卡 === 多线程不一定按顺序进行

2.最终打出了5个用时 === 一个线程exit()之后,其他线程不受影响,继续运行

再看看设置守护

1473986-20190408225431558-1463324380.png

其他代码不变,只给苦逼青年daemon.图中有两种方式

1473986-20190408230343890-1245340639.png

结果:

苦逼青年抢票被中断,抛出异常 === 设置守护意味着不重要,主线程退出,守护进程随即被中断

join()设置阻塞

1473986-20190408231126506-305885525.png

在setDaemon的情况下join,只测试苦逼青年的

1473986-20190408231050660-86420606.png

结果:

完美运行完了 === join的作用:被join的子线程执行完之后,主线程才能进行。

这里就算SetDaemon,主线程也带等苦逼青年运行完。SetDaemon后,用join,相当于没有设置守护进程

作用:当你想做完一些事,再做另一些事,就可以join一下

遇到的坑

原因:

使用了多线程,多线程共享了同一个数据库连接,但每个execute前没有加上互斥锁

方法:

方法一:每个execute前加上互斥锁

lock.acquire()

cursor.execute(command,data)

lock.release()

方法二:

每个线程拥有自己的数据库连接,即在线程调用函数中加上数据库连接代码

方法三:

所有线程共用一个连接池,需要考虑线程总数和连接池连接数上限的问题

另外

threading.Thread(target =,args=(,))

args应当传入Tuble(元组)

第二:传入的参数不是引用传递,而是新分配了内存。估计是把参数初始化到类的成员里面去了吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值