Python多线程实例
前言
感觉理解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多线程实例的更多相关文章
- Python 多线程 实例
多线程实例 import threading import time def eat(): eatTime = time.time() for i in range(30): print('count ...
- 简单的python多线程实例
今天抽时间又学了一下python的多线程,理解的又多了一些,为了利于理解,写了一段很简单的代码,如下: import threading from time import sleep def task ...
- python 多线程实例
#!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- python多线程同步实例分析
进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...
- python多线程知识-实用实例
python多线程使用场景:IO操作,不适合CPU密集操作型任务 1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- python 多线程学习
多线程(multithreaded,MT),是指从软件或者硬件上实现多个线程并发执行的技术 什么是进程? 计算机程序只不过是磁盘中可执行的二进制(或其他类型)的数据.它们只有在被读取到内存中,被操作系 ...
- 【跟我一起学Python吧】Python 多线程
其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: from time import ctim ...
随机推荐
- 二、2.1 Java的下载和安装
1.下载Java 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- jenkins中shell脚本编写的两个注意点
在jenkins的build中,如果用shell脚本的话,要记住有两个地方要注意 1.由于默认jenkins是使用/bin/bash -xe xxx.sh来调用脚本的,所以不同于日常写的脚本,任何一行 ...
- MongoDB4.0 WINDOWS环境下 副本集、分片部署
部署开始: 创建路径 D:\Program Files\MongoDB\MySet下 config Data log 文件夹 config文件夹下准备配置文件: 分片1的副本集1 storage: d ...
- 学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人
真正掌握一种算法,最实际的方法,完全手写出来. LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语 ...
- Redis不支持ssl
一直在公司内部推荐redis做cache管理,今天偶然想起虽然C#没问题,可是c/c++没查过可不可行. 结果查了一下,还真tmd有问题,官方的c client版本只支持linux side的,根本没 ...
- [SQL] 从文本中提取数值
现需求从上方测试数据的“备注”列中提取出金额 目前有两个方法比较容易实现: 1.首先比较容易想到的就是利用函数stuff删除掉所有的非数值字符. STUFF ( character_expressio ...
- Ansible 批量修改密码
客户要求每3个月修改一次主机密码.密码规则为客服提供的一串字符 xxxx + 主机后3位. 将需要登录主机添加到 Ansible. 将需要登录主机的公钥添加到 known_hosts ssh-keys ...
- Difference between ulimit, lsof, cat /proc/sys/fs/file-max
https://unix.stackexchange.com/questions/476351/difference-between-ulimit-lsof-cat-proc-sys-fs-file- ...
- 如何快速开发html5跨平台K12/幼儿交互课件、动画课件、交互游戏
flash交互课件能生动表达教学内容,也深受广大教育工作者的喜爱,但是目前flash课件只能在pc电脑平台上进行展示,随着移动网络的发展,越来越多的课件产品需要移殖到各种移动平台(手机,pad,智能电 ...
- 深入理解C#的装箱和拆箱(转)
装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作. 1. 装箱在值类型向引用类型转换时发生 2. 拆箱在引用类型向值类型转换时发生 光上述两句话不难理解,但是往深处了解,就需要一些篇幅来解释了 ...