一、共享可变类型参数

可变类型(列表、字典、可变集合)

要共享的是可变类型参数,直接将该参数当作实参通过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同一进程下线程共享全局变量相关推荐

  1. python进程的注意点(进程之间不共享全局变量、主进程会等待所有的子进程执行结束再结束)

    1. 进程的注意点介绍 进程之间不共享全局变量 主进程会等待所有的子进程执行结束再结束 2. 进程之间不共享全局变量 import multiprocessing import time# 定义全局变 ...

  2. 怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...

    本文带来各类奇怪的IT百科知识. [百尺竿头,更进一步学Python]Python进阶课程--进程:线程和协程的区别 现在多进程多线程已经是老生常谈了:协程也在最近几年流行起来.今天我们本文主要介绍进 ...

  3. Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )

    1. 进程.线程的对比 进程,能够完成多任务,比如:  一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...

  4. 同一进程的线程共享的资源和独有的资源

    线程共享的环境包括:进程代码段.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯).进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID.       进程拥 ...

  5. 多线程-threading和进程VS线程(python 版)

    多线程-threading python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用 1. 使用threading模块 ...

  6. Python基础:进程、线程、协程(2)

    进程与线程 什么是进程(process)? An executing instance of a program is called a process. Each process provides ...

  7. Python 并发1 进程,线程

    Python 并发1: 进程,线程 相信大家在操作系统就了解过 进程,线程,死锁,系统调度等等,对基本的概念还是有的.但是,在实践的过程上我在python上的实现却略有不足.所以重新入门Python并 ...

  8. Python中的进程和线程

    一.Python中两种创建进程的方式 1.os.fork只适用于Linux/Mac 2.使用multiprocessing模块可以跨平台实现多进程 使用os.fork(),像Linux平台上那样创建多 ...

  9. Python中的进程和线程(20)

    进程和线程 进程 创建多进程 进程和全局变量 传递参数和进程号 进程的状态 进程之间通信 put() get()方法 生产者和消费者 进程子类化 生产者和消费者子类化 进程池 线程 线程子类化 共享全 ...

  10. python并发编程--进程、线程、协程、锁、池、队列

    文章目录 操作系统的概念 进程 multiprocessing模块 守护进程 使用多进程实现一个并发的socket的server 锁 生产者消费者模型 数据共享 线程threading模块 守护线程和 ...

最新文章

  1. dataframe 拆分 分裂
  2. mysql数据库增删改实例_Mysql1:数据库表操作,增删改查举例
  3. 十分钟成为 Contributor 系列 | 为 TiDB 重构 built-in 函数
  4. 如何使用pip升级所有Python软件包?
  5. 使用Python进行科学计算:NumPy入门
  6. Android 2.2
  7. TESLA CENTER
  8. python工程技巧_python 19个值得学习的编程技巧
  9. java接口的修饰符可以为,附架构师必备技术详解
  10. 求出所有这些四位数是素数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b中的四位数按从小到大的顺序进行排序
  11. 游戏筑基开发之简单迷宫行走(内附碰撞检测底层逻辑)
  12. 国外注册的域名dns服务器换回国内dns服务器的详细教程!...
  13. 清华大学数据结构c语言版pdf,清华大学出版社-图书详情-《数据结构(C语言版)(第3版)》...
  14. PhpStorm设置格式化代码快捷键
  15. Android应用切换皮肤功能实现
  16. 解决yum安装gcc报错:Error: Package: glibc-headers-2.17-317.el7.x86_64
  17. Spacemacs 安装和简要配置
  18. DirectX11 With Windows SDK--28 计算着色器:波浪(水波)
  19. 程序运行所花费的时间如何计算
  20. 分享101个PHP源码,总有一款适合您

热门文章

  1. C#串口类的应用与注意
  2. Citrix X1鼠标正式发布,思杰公司改做硬件厂商了吗?
  3. 汽车汽配行业S2B2B电子商务网站提升产业资源集中度,创新供应链金融服务
  4. 单板机上Android通过Modbus RTU操控外设
  5. 软件测试指标图表分析,(最新整理)JMeter测试数据和测试结果分析图表
  6. 从电子垃圾中提炼黄金,可以!!!
  7. springboot整合消息索引
  8. 便签转移(以vivo x9转到realme x7 Pro为例)
  9. 微博视频排名标题怎么批量提取组合
  10. 2021牛客暑期多校训练营1(补题)