前言

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

实例:抢车票

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

说说区别:

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

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

守护线程SetDaemon

不设置守护进程

 import threading
import time
#使用函数式 #会员
def vip(t1):
global num
time.sleep(2) #等待时间相同,区别是进场的先后顺寻
if num == 15:
print("用时:", time.time() - t1)
exit(0)
num += 1
print('会员,当前被抢票数:', num)
#有加速包的家伙
def aboostOne(t1):
global num
time.sleep(2) #等待时间相同,区别是进场的先后顺寻
if num == 15:
print("用时:",time.time()-t1)
exit(0)
num+=1
print('加速包,当前被抢票数:', num) #没有加速包的苦逼
def commonOne(t1):
global num
time.sleep(2) #等待时间相同,区别是进场的先后顺寻
if num == 15:
print("用时:", time.time() - t1)
exit(0)
num += 1
print('苦逼青年,当前被抢票数:', num) if __name__ =='__main__':
t1 =time.time() #开始时间
num =0 #只有15张票
#vip优先,来3个
for i in range(3):
threading.Thread(target=vip,args=(t1,)).start()
#加速包其次,来7个
for i in range(7):
threading.Thread(target=aboostOne,args=(t1,)).start()
#苦逼青年最后,来10个
for i in range(10):
threading.Thread(target=commonOne,args=(t1,)).start()

exam1

结论:

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

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

再看看设置守护

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

结果:

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

  

join()设置阻塞

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

结果:

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

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

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

遇到的坑

pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

原因:

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

方法:

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

lock.acquire()
        cursor.execute(command,data)     
        lock.release()

方法二:

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

方法三:

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

另外

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

  args应当传入Tuble(元组)

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

转自:https://www.cnblogs.com/heiao10duan/p/9373237.html

Python多线程实例的更多相关文章

  1. Python 多线程 实例

    多线程实例 import threading import time def eat(): eatTime = time.time() for i in range(30): print('count ...

  2. 简单的python多线程实例

    今天抽时间又学了一下python的多线程,理解的又多了一些,为了利于理解,写了一段很简单的代码,如下: import threading from time import sleep def task ...

  3. python 多线程实例

    #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): ...

  4. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  5. python多线程同步实例分析

    进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...

  6. python多线程知识-实用实例

    python多线程使用场景:IO操作,不适合CPU密集操作型任务   1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...

  7. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  8. python 多线程学习

    多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...

  9. 【跟我一起学Python吧】Python 多线程

    其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: from time import ctim ...

随机推荐

  1. String formate的语法解析及简单用法

    转自:https://blog.csdn.net/jiangyu1013/article/details/52607257 package cn.wuxiangbin.StringFormat; im ...

  2. Ajax会自动将返回的对象属性首字母转化为小写

    今天在使用Ajax的时候遇到的问题. $.ajax({ type: "post", url: "<%=basePath%>reserd'f'w/liswe'f ...

  3. linux中mysql配置文件和jdk环境变量

    mysql配置文件 [client]default-character-set = utf8mb4 [mysql]socket = /var/lib/mysql/mysql.sockdefault-c ...

  4. 实验十 ZStack 网状网络实验

    实验十 ZStack 网状网络实验[实验目的]1. 了解 ZigBee 网状网络结构2. 掌握构建网状网络的方法[实验设备]1. 装有 IAR 开发工具的 PC 机一台2. 实验箱一台3. CCDeb ...

  5. java jdk jre

    Java11新特性: https://www.cnblogs.com/eric-shao/p/10025180.html java的一些基本概念——java11.jdk.jre.jvm: https: ...

  6. Lambda表达式中的GroupBy使用的正确姿势

    本实例适用于:将记录中的数据进行分组得到一个一对多模型数据Model 案例中的Model 注:UserDetailes 包含User的信息和其所属部门信息 需求:将UserDetailes 的记录分组 ...

  7. OO第二单元作业分析

    前言 这一单元关于线程安全的作业结束了,在助教提供的接口的帮助以及老师提供的设计模型的指导下,这三次作业还是相对轻松地完成了,中间也没有出现什么bug,可能就是因为简单的逻辑不容易出错吧,可惜两次都由 ...

  8. the status bar issue of react-native Modal on Android ( RN v0.57.0)

    Problem: When use Modal in react-native, the status bar is not included if you make a full-screen ma ...

  9. 软件开发者路线图梗概&书摘chapter1

    软件技能的概念 本书目的:尝试为软件开发的新颖方法整理出一份宣言 原因:定义泛化 从敏捷开发运动中学到的经验:理解支撑规则的底层因素 软件技能的愿景:价值的提取&希望的表达 价值体系: 1.基 ...

  10. 学习笔记TF055:TensorFlow神经网络简单实现一元二次函数

    TensorFlow运行方式.加载数据.定义超参数,构建网络,训练模型,评估模型.预测. 构造一个满足一元二次函数y=ax^2+b原始数据,构建最简单神经网络,包含输入层.隐藏层.输出层.Tensor ...