修改全局变量,设立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 线程复习相关推荐

  1. Python 线程创建和传参 - Python零基础入门教程

    目录 一.Python 线程解释 二.Python 线程创建和启动 1.导入线程模块 2.创建线程并初始化线程 3.启动线程 三.Python 线程传参 四.Python 线程结束 五.Python ...

  2. python 线程通信的几种方式_Python 线程、线程通信、多线程

    这是一篇学习Python 线程相关的内容,记录一下以备复习和开发使用,技术有限,如有问题欢迎指出,多谢. 一.GIL 全局解释器锁(cpython) 1.为什么会有这个锁:为了线程安全,减少pytho ...

  3. 【面试复习】Python基础复习

    [面试复习]Python基础复习 前言 相信一些学习python的朋友找不到一些python的的朋友找不到相对应的python面经,所以博主就推荐大家可以去牛客上面看看哦,各种大厂面经和习题哦! 地址 ...

  4. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  5. 什么是Python线程?Python线程如何创建?

    相信正在学习Python技术或者对Python语言有一定了解的人对于Python线程应该都不陌生,但是也有刚接触Python的小伙伴对于Python线程并不了解,今天小编就跟大家聊聊什么是Python ...

  6. 太牛了 Python期末复习总结,提高成绩必备回家过个开心年

    Python期末复习之语法 将用一张思维导图的形式来展示python的基础语法. Python期末复习之运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑 ...

  7. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  8. python线程池阻塞队列_福利又来啦!python多线程进阶篇

    使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...

  9. python - 线程

    python之路--线程 简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Thre ...

  10. Python线程同步机制: Locks, RLocks, Semaphores, Condition

    为什么80%的码农都做不了架构师?>>>    翻译自Laurent Luce的博客 原文名称:Python threads synchronization: Locks, RLoc ...

最新文章

  1. OpenCV中积分图介绍与应用
  2. 全新版本仿网易云音乐来啦
  3. 检查网口流量与前10名流量大IP
  4. 【Redis学习】Redis开启多个端口
  5. OBD技术速成——J1850协议概述
  6. 什么是3G-SDI光端机?
  7. IE9给我带来的惊喜和不解(For Silverlight不解)
  8. Django框架第一篇基础
  9. [转帖]CentOS 7安装并启动Google浏览器(★firecat亲测有效★)
  10. mysql er图 linux_ER图设计
  11. 【算法】格雷码(Gray Code)与8421二进制码之间的转换算法 (LeetCode89)
  12. 配置jdk与maven环境变量
  13. 如何成为优秀的驱动开发工程师
  14. 制造业质量管理四大病因
  15. 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系互转
  16. 2021-2027全球与中国物联网基础设施市场现状及未来发展趋势
  17. 2020java面试总结
  18. commvault xtrabackup全实例备份失败 处于未决状态
  19. 服务器i620-g15用什么型号内存,定位不同领域 曙光I620-G15服务器评测
  20. ps——拼接两张图片

热门文章

  1. centos 更新内核步骤
  2. v​n​c​服​务​​安​装​与配置
  3. Java CookBook(一)
  4. TCP网络通讯如何解决分包粘包问题
  5. 使用Mathcad解受迫振动微分方程并画图
  6. BZOJ2118[国家集训队] 墨墨的等式
  7. json_extract提取复杂json_Python中高效使用JSON的四个小窍门
  8. oa系统服务器到国外,oa系统放到云服务器云服务器
  9. php 数组 utf8,PHP数组编码gbk与utf8互相转换的两种方法实例分享
  10. linux java 栈_JVM 与 Linux 的内存关系详解