修改全局变量,设立flag来避免线程间数据冲突,低效率版

  1. from threading import Thread
  2. import time
  3.  
  4. g_num=0
  5. g_flag = 1
  6.  
  7. def test1():
  8. global g_num
  9. global g_flag
  10. if g_flag ==1:
  11. for i in range(1000000):
  12. g_num += 1
  13.  
  14. g_flag = 0
  15. print('----test1----g_num=%d'%g_num)
  16.  
  17. def test2():
  18. global g_num
  19. global g_flag
  20. while True:
  21. if g_flag != 1:
  22. for i in range(1000000):
  23. g_num += 1
  24. break
  25.  
  26. print('----test2----g_num=%d' % g_num)
  27. p1 = Thread(target=test1)
  28. p1.start()
  29.  
  30. p2 = Thread(target=test2)
  31. p2.start()

修改全局变量,互斥锁(高效版),否则不用枷锁

  1. from threading import Thread,Lock
  2. import time
  3.  
  4. g_num=0
  5.  
  6. def test1():
  7. global g_num
  8. for i in range(1000000):
  9. mutex.acquire() # 上锁
  10. g_num += 1
  11. mutex.release() #解锁
  12. print('----test1----g_num=%d'%g_num)
  13.  
  14. def test2():
  15. global g_num
  16. for i in range(1000000):
  17. mutex.acquire() # 上锁
  18. g_num += 1
  19. mutex.release() # 解锁
  20.  
  21. print('----test2----g_num=%d' % g_num)
  22.  
  23. mutex = Lock()
  24.  
  25. p1 = Thread(target=test1)
  26. p1.start()
  27.  
  28. p2 = Thread(target=test2)
  29. p2.start()

死锁

添加超时时间 mutex.acquire(timeout = 1)

银行家算法-先满足最小需求单位,等待

 ThreadLocal

可以解决线程间全局变量,不会因为线程修改全局变量而修改,完成数据间传递,不会因为程序一样而导致数据错乱

代码如下:

  1. import threading
  2.  
  3. # 创建全局变量threadLocal
  4. loacl_school = threading.local()
  5.  
  6. def process_student():
  7. # 获取当前线程关联的student
  8. std = loacl_school.student
  9. print(std)
  10.  
  11. def process_thrad(name):
  12. # 绑定threadlocal的student
  13. loacl_school.student = name
  14. process_student()
  15.  
  16. t1 = threading.Thread(target=process_thrad,args=('laowang',),name='thread-a')
  17. t2 = threading.Thread(target=process_thrad,args=('xiaowang',),name='thread-b')
  18.  
  19. t1.start()
  20. t2.start()
  21.  
  22. t1.join()
  23. t2.join()

 异步

callback=func,并把之前函数返回值复制到func

GIL 全局解释器锁

解决办法:1、用多进程2、用C语言写关键部分

python部分

  1. from ctypes import *
  2. from threading import Thread
  3.  
  4. # 加载动态库
  5. lib = cdll.LoadLibrary('./libdeadloop.so')
  6.  
  7. #创建一个子线程,让其执行C语言编写的函数,此函数是一个死循环
  8. t = Thread(target=lib.DeadLoop)
  9. t.start()
  10.  
  11. # 主线程页调用C语言写的那个死循环函数
  12. lib.DeadLoop()
  13.  
  14. while True:
  15. pass

C语言代码

  1. {
  2. while(){
  3. ;
  4. }

  5. }

生成libdealloop.so库

线程同步

  1. import threading
  2.  
  3. mylock = threading.RLock()
  4. num = 0
  5.  
  6. class myThread(threading.Thread):
  7. def __init__(self,name):
  8. threading.Thread.__init__(self,name=name)
  9.  
  10. def run(self):
  11. global num
  12. while True:
  13. mylock.acquire()
  14. print('%s locked,Number:%d'% (threading.current_thread().name,num))
  15. if num>=4:
  16. mylock.release()
  17. print('%s locked,Number:%d'% (threading.current_thread().name,num))
  18. break
  19. num+=1
  20. print('%s locked,Number:%d'% (threading.current_thread().name,num))
  21. mylock.release()
  22.  
  23. if __name__ =='__main__':
  24. thread1 = myThread('Thread_1')
  25. thread2 = myThread('Thread_2')
  26. thread1.start()
  27. thread2.start()

Python 线程复习的更多相关文章

  1. Python并发复习1 - 多线程

    一.基本概念 程序: 指令集,静态, 进程: 当程序运行时,会创建进程,是操作系统资源分配的基本单位 线程: 进程的基本执行单元,每个进程至少包含一个线程,是任务调度和执行的基本单位 > 进程和 ...

  2. python 线程、多线程

    复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...

  3. python 线程创建和传参(28)

    在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...

  4. python——线程与多线程进阶

    之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...

  5. python——线程与多线程基础

    我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...

  6. [python] 线程简介

    参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...

  7. PYTHON线程知识再研习A

    前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功 ...

  8. Python 线程(threading) 进程(multiprocessing)

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. Python线程:线程的调度-守护线程

    Python线程:线程的调度-守护线程   守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.在python中建议使用的是thread. ...

随机推荐

  1. 【NOIP2012】开车旅行(倍增)

    题面 Description 小A 和小B决定利用假期外出旅行,他们将想去的城市从1到N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i的海拔高度为Hi,城市 ...

  2. Bzoj2337:[HNOI2011]XOR和路径

    题面 bzoj Sol 设\(f[i]\)表示\(i到n\)的路径权值某一位为\(1\)的期望 枚举每一位,高斯消元即可 不要问我为什么是\(i\ - \ n\)而不可以是\(1\ - \ i\) # ...

  3. Python中的栈溢出及解决办法

    1.递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 举个例子,我们来计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示, ...

  4. css块级元素和内联元素

    左边的是块级元素block,右边内联inline. 修改方法 display: inline;

  5. TP5模型类关键字赋值

    在写项目过程中 开始的代码如下 $ms = new MStore(); $ms->userid = $userid; $ms->address = $mc->address; $ms ...

  6. c#事件的应用

    我已经多次使用c#事件了.举个最近的例子:我用vsto做的一个word插件.这个插件分为两层,业务逻辑层和word外接程序.有这么一个场景,我的ribbon中的一个label是动态显示的.它会随着wo ...

  7. 淘宝镜像 cnpm 不是内部命令

    升级npm之后安装淘宝镜像,然后一直提示不是内部命令,网上查看文章 http://blog.csdn.net/fighting_2017/article/details/76979844,发现是路径问 ...

  8. 学习笔记-C++ STL iterator与对指针的理解-20170618

    vector的itrerator支持random access #include<iostream> #include<vector> using namespace std; ...

  9. 面向对象设计模式_生成器模式详解(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  10. iOS刚进入后台接受推送、打开推送调转到相应的界面

    刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接 /** 注释:打开推送的三种方式:-peter 1.apns的时候,结束进程退出后台:启动的时 ...