Python 线程复习
修改全局变量,设立flag来避免线程间数据冲突,低效率版
from threading import Thread import timeg_num=0 g_flag = 1def test1():global g_numglobal g_flagif g_flag ==1:for i in range(1000000):g_num += 1 g_flag = 0print('----test1----g_num=%d'%g_num)def test2():global g_numglobal g_flagwhile True:if g_flag != 1:for i in range(1000000):g_num += 1breakprint('----test2----g_num=%d' % g_num) p1 = Thread(target=test1) p1.start()p2 = Thread(target=test2) p2.start()
修改全局变量,互斥锁(高效版),否则不用枷锁
from threading import Thread,Lock import timeg_num=0def test1():global g_numfor i in range(1000000):mutex.acquire() # 上锁g_num += 1mutex.release() #解锁print('----test1----g_num=%d'%g_num)def test2():global g_numfor i in range(1000000):mutex.acquire() # 上锁g_num += 1mutex.release() # 解锁print('----test2----g_num=%d' % g_num)mutex = Lock()p1 = Thread(target=test1) p1.start()p2 = Thread(target=test2) p2.start()
死锁
添加超时时间 mutex.acquire(timeout = 1)
银行家算法-先满足最小需求单位,等待
ThreadLocal
可以解决线程间全局变量,不会因为线程修改全局变量而修改,完成数据间传递,不会因为程序一样而导致数据错乱
代码如下:
import threading# 创建全局变量threadLocal loacl_school = threading.local()def process_student():# 获取当前线程关联的studentstd = loacl_school.studentprint(std)def process_thrad(name):# 绑定threadlocal的studentloacl_school.student = nameprocess_student()t1 = threading.Thread(target=process_thrad,args=('laowang',),name='thread-a') t2 = threading.Thread(target=process_thrad,args=('xiaowang',),name='thread-b')t1.start() t2.start()t1.join() t2.join()
异步
callback=func,并把之前函数返回值复制到func
GIL 全局解释器锁
解决办法:1、用多进程2、用C语言写关键部分
python部分
from ctypes import * from threading import Thread# 加载动态库 lib = cdll.LoadLibrary('./libdeadloop.so')#创建一个子线程,让其执行C语言编写的函数,此函数是一个死循环 t = Thread(target=lib.DeadLoop) t.start()# 主线程页调用C语言写的那个死循环函数 lib.DeadLoop()while True:pass
C语言代码
{while(1){;} }
生成libdealloop.so库
线程同步
import threadingmylock = threading.RLock() num = 0class myThread(threading.Thread):def __init__(self,name):threading.Thread.__init__(self,name=name)def run(self):global numwhile True:mylock.acquire()print('%s locked,Number:%d'% (threading.current_thread().name,num))if num>=4:mylock.release()print('%s locked,Number:%d'% (threading.current_thread().name,num))breaknum+=1print('%s locked,Number:%d'% (threading.current_thread().name,num))mylock.release()if __name__ =='__main__':thread1 = myThread('Thread_1')thread2 = myThread('Thread_2')thread1.start()thread2.start()
转载于:https://www.cnblogs.com/Erick-L/p/7137627.html
Python 线程复习相关推荐
- Python 线程创建和传参 - Python零基础入门教程
目录 一.Python 线程解释 二.Python 线程创建和启动 1.导入线程模块 2.创建线程并初始化线程 3.启动线程 三.Python 线程传参 四.Python 线程结束 五.Python ...
- python 线程通信的几种方式_Python 线程、线程通信、多线程
这是一篇学习Python 线程相关的内容,记录一下以备复习和开发使用,技术有限,如有问题欢迎指出,多谢. 一.GIL 全局解释器锁(cpython) 1.为什么会有这个锁:为了线程安全,减少pytho ...
- 【面试复习】Python基础复习
[面试复习]Python基础复习 前言 相信一些学习python的朋友找不到一些python的的朋友找不到相对应的python面经,所以博主就推荐大家可以去牛客上面看看哦,各种大厂面经和习题哦! 地址 ...
- python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现
概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...
- 什么是Python线程?Python线程如何创建?
相信正在学习Python技术或者对Python语言有一定了解的人对于Python线程应该都不陌生,但是也有刚接触Python的小伙伴对于Python线程并不了解,今天小编就跟大家聊聊什么是Python ...
- 太牛了 Python期末复习总结,提高成绩必备回家过个开心年
Python期末复习之语法 将用一张思维导图的形式来展示python的基础语法. Python期末复习之运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑 ...
- python 线程锁 共享全局变量 线程通信
python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...
- python线程池阻塞队列_福利又来啦!python多线程进阶篇
使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...
- python - 线程
python之路--线程 简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Thre ...
- Python线程同步机制: Locks, RLocks, Semaphores, Condition
为什么80%的码农都做不了架构师?>>> 翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLoc ...
最新文章
- OpenCV中积分图介绍与应用
- 全新版本仿网易云音乐来啦
- 检查网口流量与前10名流量大IP
- 【Redis学习】Redis开启多个端口
- OBD技术速成——J1850协议概述
- 什么是3G-SDI光端机?
- IE9给我带来的惊喜和不解(For Silverlight不解)
- Django框架第一篇基础
- [转帖]CentOS 7安装并启动Google浏览器(★firecat亲测有效★)
- mysql er图 linux_ER图设计
- 【算法】格雷码(Gray Code)与8421二进制码之间的转换算法 (LeetCode89)
- 配置jdk与maven环境变量
- 如何成为优秀的驱动开发工程师
- 制造业质量管理四大病因
- 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转
- 2021-2027全球与中国物联网基础设施市场现状及未来发展趋势
- 2020java面试总结
- commvault xtrabackup全实例备份失败 处于未决状态
- 服务器i620-g15用什么型号内存,定位不同领域 曙光I620-G15服务器评测
- ps——拼接两张图片
热门文章
- centos 更新内核步骤
- v​n​c​服​务​​安​装​与配置
- Java CookBook(一)
- TCP网络通讯如何解决分包粘包问题
- 使用Mathcad解受迫振动微分方程并画图
- BZOJ2118[国家集训队] 墨墨的等式
- json_extract提取复杂json_Python中高效使用JSON的四个小窍门
- oa系统服务器到国外,oa系统放到云服务器云服务器
- php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
- linux java 栈_JVM 与 Linux 的内存关系详解