python threading同一进程下线程共享全局变量
一、共享可变类型参数
可变类型(列表、字典、可变集合)
要共享的是可变类型参数,直接将该参数当作实参通过args传入线程中去,其中sleep函数的作用是降低运行速度,方便打印出想要的结果
import threading
from time import sleepdef demo1(a,num):sleep(0.5)#为a增加元素for i in range(num):a.append(i)print('demo1的a:{}'.format(a))def demo2(a,num):sleep(0.5)#为a增加元素for i in range(num):a.append(i*2)print('demo2的a:{}'.format(a))def main():#创建两个参数a=[11,22,33]num=8#创建两个线程,并将两个参数传递给指定的函数threading.Thread(target=demo1,args=(a,num)).start()threading.Thread(target=demo2, args=(a,num)).start()#打印线程数print(threading.enumerate())sleep(1)print('主线程的a:{}'.format(a))if __name__ =='__main__':main()
打印结果:
可以看到最后的结果是两个线程内的计算都进行了的,即同一进程下线程是共享变量的。
二、共享不可变类型参数
不可变类型(数字、字符串、元组、不可变集合)
要共享的是不可变类型参数,不能直接将该参数当作实参通过args传入线程中去,需要在进程执行前创建不可变类型的参数,并且在线程中对其进行修改时需要申明全局变量。
import threading
from time import sleepdef demo1(num):'''a+100'''sleep(0.5)for i in range(num):global aa +=1print('demo1的a:{}'.format(a))
def demo2(num):'''a+100'''sleep(0.5)for i in range(num):global aa +=1print('demo2的a:{}'.format(a))def main():#创建一个参数num=100#创建两个线程,并将参数传递给指定的函数threading.Thread(target=demo1,args=(num,)).start()threading.Thread(target=demo2, args=(num,)).start()#打印线程数print(threading.enumerate())sleep(1)print('主线程的a:{}'.format(a))if __name__ =='__main__':#创建不可变类型的参数a=0main()
打印结果:
三、互斥锁(共享过程中碰到的问题)
当 参数a 加100,加200时,没有碰到问题,加10000000,加两千呢?上代码,直接将num改成10000000 ,此时的运行结果:
原因:多线程共享全局变量会出现资源竞争
解决方法:使用互斥锁,一个线程使用锁时,另一个线程就不能对锁中的对象进行操作,直到解锁后,才能对锁中的对象进行操作。
import threading
from time import sleepdef demo1(num,mutex):'''对数据进行操作'''for i in range(num):global a#锁定mutex.acquire()#对数据进行处理a +=1#解锁mutex.release()print('demo1的a:{}'.format(a))
def demo2(num,mutex):'''对数据进行操作'''for i in range(num):global a# 锁定mutex.acquire()# 对数据进行处理a += 1# 解锁mutex.release()print('demo2的a:{}'.format(a))def main():#创建一个互斥锁,默认没有上锁mutex=threading.Lock()#创建一个参数num=10000000#创建两个线程,并将参数传递给指定的函数threading.Thread(target=demo1,args=(num,mutex)).start()threading.Thread(target=demo2, args=(num,mutex)).start()#打印线程数print(threading.enumerate())sleep(10)print('主线程的a:{}'.format(a))if __name__ =='__main__':#创建不可变类型的参数a=0main()
从上面可以看到其实互斥锁就是调用了一个threading下的lock函数
#创建一个互斥锁,默认没有上锁 mutex=threading.Lock() # 锁定 mutex.acquire() # 对数据进行处理 a += 1 # 解锁 mutex.release()
打印结果:
python threading同一进程下线程共享全局变量相关推荐
- python进程的注意点(进程之间不共享全局变量、主进程会等待所有的子进程执行结束再结束)
1. 进程的注意点介绍 进程之间不共享全局变量 主进程会等待所有的子进程执行结束再结束 2. 进程之间不共享全局变量 import multiprocessing import time# 定义全局变 ...
- 怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...
本文带来各类奇怪的IT百科知识. [百尺竿头,更进一步学Python]Python进阶课程--进程:线程和协程的区别 现在多进程多线程已经是老生常谈了:协程也在最近几年流行起来.今天我们本文主要介绍进 ...
- Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )
1. 进程.线程的对比 进程,能够完成多任务,比如: 一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...
- 同一进程的线程共享的资源和独有的资源
线程共享的环境包括:进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥 ...
- 多线程-threading和进程VS线程(python 版)
多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用 1. 使用threading模块 ...
- Python基础:进程、线程、协程(2)
进程与线程 什么是进程(process)? An executing instance of a program is called a process. Each process provides ...
- Python 并发1 进程,线程
Python 并发1: 进程,线程 相信大家在操作系统就了解过 进程,线程,死锁,系统调度等等,对基本的概念还是有的.但是,在实践的过程上我在python上的实现却略有不足.所以重新入门Python并 ...
- Python中的进程和线程
一.Python中两种创建进程的方式 1.os.fork只适用于Linux/Mac 2.使用multiprocessing模块可以跨平台实现多进程 使用os.fork(),像Linux平台上那样创建多 ...
- Python中的进程和线程(20)
进程和线程 进程 创建多进程 进程和全局变量 传递参数和进程号 进程的状态 进程之间通信 put() get()方法 生产者和消费者 进程子类化 生产者和消费者子类化 进程池 线程 线程子类化 共享全 ...
- python并发编程--进程、线程、协程、锁、池、队列
文章目录 操作系统的概念 进程 multiprocessing模块 守护进程 使用多进程实现一个并发的socket的server 锁 生产者消费者模型 数据共享 线程threading模块 守护线程和 ...
最新文章
- dataframe 拆分 分裂
- mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
- 十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数
- 如何使用pip升级所有Python软件包?
- 使用Python进行科学计算:NumPy入门
- Android 2.2
- TESLA CENTER
- python工程技巧_python 19个值得学习的编程技巧
- java接口的修饰符可以为,附架构师必备技术详解
- 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序
- 游戏筑基开发之简单迷宫行走(内附碰撞检测底层逻辑)
- 国外注册的域名dns服务器换回国内dns服务器的详细教程!...
- 清华大学数据结构c语言版pdf,清华大学出版社-图书详情-《数据结构(C语言版)(第3版)》...
- PhpStorm设置格式化代码快捷键
- Android应用切换皮肤功能实现
- 解决yum安装gcc报错:Error: Package: glibc-headers-2.17-317.el7.x86_64
- Spacemacs 安装和简要配置
- DirectX11 With Windows SDK--28 计算着色器:波浪(水波)
- 程序运行所花费的时间如何计算
- 分享101个PHP源码,总有一款适合您