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. ...
随机推荐
- Python基础__函数
本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...
- 通过分析HSL/HSB获取图片主色调
这两天稍微研究了一下颜色的HSL/HSB值,主要因为写程序想要实现通过一张图片拿到图片中的最突出的颜色值(类似Groove Music中播放栏背景就是从专辑封面中取出主色调,还有Windows 10任 ...
- VS中使用.NET Reactor进行代码混淆
.NET Reactor相信大家都不陌生,网上使用教程也很多.但绝大多数都只介绍到软件的使用,而对于在VS中使用介绍的不多. 首先,在.NET Reactor的Help中Add In,如下图. 重启V ...
- html学习第二弹の表格的使用方法
>创建表格的四个元素: table.tbody.tr.th.td 1.<table>-</table>:整个表格以<table>标记开始.</table ...
- js实现二叉树
//binary tree//add order remove findfunction tree() { var node = function(key) { this.left = null; ...
- WebStorm配置Vue开发环境
虽然最新版的前端开发利器WebStorm支持了Vue,但是大部分人的WebStorm依然是默认不支持Vue的老版本(比如之前的我),所以需要手动添加WebStorm对Vue的支持.要想让WebStor ...
- find命令总结
find命令 2018-2-27日整理完成 1,结合-exec的用法 查当前目录下的所有普通文件,并在 -exec 选项中使用ls -l命令将它们列出# find . -type f -exec ls ...
- IPFS的竞争对手们(一)
IPFS的竞争对手 IPFS这个项目真的开发很慢,相比其它区块链项目,IPFS的进度可真是让小编捉急,恨铁不成钢啊.然而小编仍然对他们充满信心,来,借用一句盗梦空间里的经典台词: 既然做梦,那就做大点 ...
- 冒泡排序及优化(Java实现)
向大端冒泡 public class BubbleSort { public static <T extends Comparable<? super T>> void sor ...
- 在使用document.getElementById('xxx').files[0]时,关于计算图片大小
在使用文件上传属性时,一直好奇图片上传的大小时如何计算的,最近在使用中认识到的计算方式: 首先,图片大小的存储基本单位是字节(byte).每个字节是由8个比特(bit)组成.所以,一个字节在十进制中 ...