修改全局变量,设立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 线程复习的更多相关文章

  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. Entity Framework Core 2.0 入门简介

    不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...

  2. ThreadPoolExecutor线程池参数设置技巧

    一.ThreadPoolExecutor的重要参数   corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线 ...

  3. 【网络流24题22】最长k可重线段集问题

    题面戳我 sol 千万!千万!不要理解错题意了!最长K可重,不是说线段最多K可重!你以为计算几何? 原文:使得在\(x\)轴上的任何一点\(p\),\(S\)中与直线\(x=p\)相交的开线段个数不超 ...

  4. Vue的组件为什么要export default

    Vue 的模块机制 Vue 是通过 webpack 实现的模块化,因此可以使用 import 来引入模块,例如: 此外,你还可以在bulid/webpack.base.conf.js文件中修改相关配置 ...

  5. 一道java基础面试题

    package test; class A {    public A(){        System.out.println("A3");    }    {        S ...

  6. react入门(一)

    JSX语法: HTML 语言直接写在 JavaScript 语言之中,不加任何引号 , JSX语法中不能使用js中的关键字,例如:class 需要改为className JSX语法中要写表达式的话,需 ...

  7. .net framework 4.5 +steeltoe+ springcloud 实现服务注册功能

    首先得先了解并熟悉一下springcloud,并手动去搭建一个服务中心,具体可度娘教程. 如果是.net core的话,实现注册也是没有问题的,网上教程很多,可自行度娘. 最难的就是基于Framewo ...

  8. div闪一下就消失

    <div id="saveCode" class="center" style="display:none;width:300px;height ...

  9. 关于LINUX各类系统资源整合

    在系统维护的过程中,随时可能有需要查看 CPU和内存的使用率,并根据相应信息分析系统状况的需求.本文介绍一下几种常见的Linux系统资源查看命令. 1.总体内存占用的查看 命令:free 图1 fre ...

  10. 将openface移植到vs2013

    github上面的开源代码openface:https://github.com/TadasBaltrusaitis/OpenFace 可用于做人脸检测和头部姿态检测,该工程是在VS2015上建立的, ...