Python 线程复习
修改全局变量,设立flag来避免线程间数据冲突,低效率版
from threading import Thread
import time g_num=0
g_flag = 1 def test1():
global g_num
global g_flag
if g_flag ==1:
for i in range(1000000):
g_num += 1 g_flag = 0
print('----test1----g_num=%d'%g_num) def test2():
global g_num
global g_flag
while True:
if g_flag != 1:
for i in range(1000000):
g_num += 1
break print('----test2----g_num=%d' % g_num)
p1 = Thread(target=test1)
p1.start() p2 = Thread(target=test2)
p2.start()
修改全局变量,互斥锁(高效版),否则不用枷锁
from threading import Thread,Lock
import time g_num=0 def test1():
global g_num
for i in range(1000000):
mutex.acquire() # 上锁
g_num += 1
mutex.release() #解锁
print('----test1----g_num=%d'%g_num) def test2():
global g_num
for i in range(1000000):
mutex.acquire() # 上锁
g_num += 1
mutex.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():
# 获取当前线程关联的student
std = loacl_school.student
print(std) def process_thrad(name):
# 绑定threadlocal的student
loacl_school.student = name
process_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(){
;
}
}
生成libdealloop.so库

线程同步
import threading mylock = threading.RLock()
num = 0 class myThread(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self,name=name) def run(self):
global num
while 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))
break
num+=1
print('%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()

Python 线程复习的更多相关文章
- Python并发复习1 - 多线程
一.基本概念 程序: 指令集,静态, 进程: 当程序运行时,会创建进程,是操作系统资源分配的基本单位 线程: 进程的基本执行单元,每个进程至少包含一个线程,是任务调度和执行的基本单位 > 进程和 ...
- python 线程、多线程
复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...
- python 线程创建和传参(28)
在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入main函数执行,这样的单线程也称为主线程. 有了单线程的话,什么又是多线程? ...
- python——线程与多线程进阶
之前我们已经学会如何在代码块中创建新的线程去执行我们要同步执行的多个任务,但是线程的世界远不止如此.接下来,我们要介绍的是整个threading模块.threading基于Java的线程模型设计.锁( ...
- python——线程与多线程基础
我们之前已经初步了解了进程.线程与协程的概念,现在就来看看python的线程.下面说的都是一个进程里的故事了,暂时忘记进程和协程,先来看一个进程中的线程和多线程.这篇博客将要讲一些单线程与多线程的基础 ...
- [python] 线程简介
参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...
- PYTHON线程知识再研习A
前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Python线程:线程的调度-守护线程
Python线程:线程的调度-守护线程 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程.在python中建议使用的是thread. ...
随机推荐
- [BZOJ1430] 小猴打架 (prufer编码)
Description 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打架之后,整个森 ...
- Redis进阶实践之十七 Redis协议的规范
一.介绍 Redis客户端使用称为RESP(Redis的序列化协议)的协议与Redis服务器进行通信. 虽然协议是专门为Redis设计的,但它可以用于其他客户端 - 服务器软件项 ...
- javascript使用闭包模拟私有属性和方法
最近因为做了一个项目,其中涉及到了js私有方法,这个概念在其语言里面是很常见的,很多语言都有private这个关键字,只要在一个类的前面加上private就表示申明了一个私有方法,但是javascri ...
- Mac下redis的安装 以及配置支持PHP使用redis
1 下载最新redis https://redis.io/download 2 安装redis. 这部分在上面下载链接中 官网提供的有相关操作 如下: $ wget http://download ...
- JavaScript的作用域
JavaScript的作用域主要是指函数的作用域,在进行结果判断的时候十分重要,如果不清楚作用域,便很有可能导致拿不到预期的结果,也就无法顺利的进行程序的编写,在经历了一系列的学习和了解之后,对相关知 ...
- ambari下 hive metastore 启动失败
由字符集引起的hive 元数据进程启动失败 解决方法新增 这2句话 reload(sys)sys.setdefaultencoding('utf8')
- H5页面基于接口实现数据交互
对于现在APP开发来说,目前流行的两个方式是原生和H5.就如同之前业界程序猿争论的BS和CS之争一样,业界对于H5和原生也有不小的争论.对于前者的争论在于PC端,后者在于移动端上体现. 那一个APP适 ...
- Hybrid App混合模式开发的了解
Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具"Native App良好用户交互体验的优势"和"Web Ap ...
- Eclipse中JRE(unbound)问题的一种解决方法
(如果有写的不对的地方,欢迎指正!) 1.检查Java环境变量配置是否有问题 jdk1.8环境变量配置(1.8和8是一个意思) jdk9环境变量配置 注:配置不成功的一种可能是安装多个jdk,解决方法 ...
- centos7服务的管理
centos7上服务管理 author:headsen chen 2017-10-16 16:03:53 1,启动服务(每条都可以) systemctl start httpd ...