多线程-共享全局变量

import threading

import time

g_num = 200

def test1():

global g_num

for i in range(5):

g_num += 1

print("--test1, g_num = %d--" % g_num)

def test2():

global g_num

print("--test2, g_num = %d--" % g_num)

if __name__ == "__main__":

print("--执行线程之前, g_num = %d--" % g_num)

t1 = threading.Thread(target=test1)

t1.start()

# 延时一会儿,确保线程t1中的事情能做

time.sleep(1)

t2 = threading.Thread(target=test2)

t2.start()

运行结果:

--执行线程之前, g_num = 200--

--test1, g_num = 205--

--test2, g_num = 205--

在上面的程序中。 test1函数

循环五次,每次将 g_num

全局变量加一并打印 g_num

的值,在 test2函数

中仅仅打印 g_num

的值。在t1线程中执行test1函数,在t2线程中执行test2函数,并在执行t2线程之前,延时一秒中来保证t1线程执行完毕。

列表当作实参传递到线程中

import threading

import time

def test1(nums):

nums.append(54)

print("--test1, nums=", nums)

g_nums = [1, 8, 9]

def test2(nums):

# 确保test1中执行完毕

time.sleep(1)

print("--test2, nums=", nums)

if __name__ == "__main__":

t1 = threading.Thread(target=test1, args=(g_nums,))

t1.start()

t2 = threading.Thread(target=test2, args=(g_nums,))

t2.start()

运行结果:

--test1, nums= [1, 8, 9, 54]

--test2, nums= [1, 8, 9, 54]

总结

在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据

缺点就是,线程是对全局变量随意修改可能造成多线程之间对全局变量的混乱(即线程非安全)

多线程-共享全局变量问题

多线程开发可能遇到的问题

假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20。

但是由于是多线程同时操作,有可能出现下面情况:

在g_num=0时,t1取得g_num=0。此时系统把t1调度为”sleeping”状态,把t2转换为”running”状态,t2也获得g_num=0

然后t2对得到的值进行加1并赋给g_num,使得g_num=1

然后系统又把t2调度为”sleeping”,把t1转为”running”。线程t1又把它之前得到的0加1后赋值给g_num。

这样导致虽然t1和t2都对g_num加1,但结果仍然是g_num=1

测试1

import threading

import time

g_num = 0

def test1(num):

global g_num

for i in range(num):

g_num += 1

print("--test1, g_num = %d--" % g_num)

def test2(num):

global g_num

for i in range(num):

g_num += 1

print("--test2, g_num = %d--" % g_num)

if __name__ == "__main__":

print("--创建线程之前, g_num = %d--" % g_num)

t1 = threading.Thread(target=test1, args=(100,))

t1.start()

t2 = threading.Thread(target=test2, args=(100,))

t2.start()

while len(threading.enumerate()) != 1:

time.sleep(1)

print("最终结果为:g_num=%d" % g_num)

运行结果:

--创建线程之前, g_num = 0--

--test1, g_num = 100--

--test2, g_num = 200--

最终结果为:g_num=200

测试2

在测试1的基础上,向test1和test2方法传入的参数的值为:9999999

运行结果:

--创建线程之前, g_num = 0--

--test1, g_num = 13554011--

--test2, g_num = 13571206--

最终结果为:g_num=13571206

很显然,期待的结果为:9999999 + 9999999 = 19999998,而运行结果为:13571206。

python多线程共享全局变量_Python多线程-共享全局变量相关推荐

  1. python web框架 多线程和多进程_python 多线程和多进程

    多线程与多进程 知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景: ...

  2. python多线程的作用_Python多线程中三个函数的强大功能简介

    在Python多线程中有三个比较简单的函数,在实际的相关操作中你对这一实际操作是否了解?是否对其感兴趣?如果你想对Python多线程的开发与多线程程序及相关实际操作方案有所了解的话,你就可以点击以下的 ...

  3. python多核多线程编程实例_Python多线程

    多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...

  4. python实用程序育儿法_Python多线程 简明例子

    Python多线程 简明例子 (2010-03-11 15:15:09) Python多线程 简明例子 综述 多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面.无论何种系统,线程调 ...

  5. python真正实现多线程的方法_python多线程几种方法实现

    匿名用户 1级 2018-05-27 回答 Python进阶(二十六)-多线程实现同步的四种方式 临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能, ...

  6. python局部变量转全局变量_python局部变量和全局变量

    python局部变量和全局变量 发布时间:2020-08-31 00:01:13 来源:51CTO 阅读:98 作者:qq5d6f345f0205e 在python开发中,变量也是有生命周期的,一旦周 ...

  7. python manager详解_python 多进程共享全局变量之Manager()详解

    Manager支持的类型有 list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和 ...

  8. python多进程共享内存_python 进程间通信 共享内存

    python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...

  9. python多线程结束线程_Python多线程和Office第2部分

    python多线程结束线程 This is the second and final part of the series. You can find the first part of the bl ...

最新文章

  1. 计算机常用图像文件格式,常用的图像文件格式
  2. 02_Nginx基本配置与参数说明 + 辅助命令
  3. python 字典 内存_Python 字典(联合内存、联合数组)
  4. 在不停止mysql复制主服务器的情况下,配置一个mysql复制从服务器
  5. [POI2006]ORK-Ploughing
  6. 关于数据库、数据仓库、数据湖、数据中台概念和区别
  7. java调用webService方法
  8. 安卓ASO怎么做?有哪些工具平台?安卓aso工具有哪些
  9. linux hci0 进程,教程 - 在 Azure Stack HCI 上的 AKS 中部署 Linux 应用程序 - AKS-HCI | Microsoft Docs...
  10. 数据库分析之概念结构设计
  11. 梦之所寄,行之所为——地狱之门就此洞开(读梦断代码有感)
  12. Java 在Word中创建多级项目符号列表和编号列表
  13. Google镜像搭建:利用 Cloudflare Workers 搭建访问谷歌镜像站点,可自行绑定域名
  14. PCL读取带rgb信息的asc文件C++
  15. 安装及配置 Mac 上的 Rime 输入法——鼠鬚管 (Squirrel)(也适用于小狼豪)
  16. 网络编程和数据库(一)
  17. python-yaml文件使用(PyYAML)
  18. iOS 客户端与服务端做时间同步
  19. 硬件学习之路——STM32之TM1638
  20. #读写文件 EX15-17

热门文章

  1. CRM端 equipment hierarchy change成功的标志
  2. Request load inbound error - COM_ATTRFRG_GEN 066
  3. My Appointment - Belonging to me, Search by team, Search by group
  4. SAP标准培训课程C4C10学习笔记(四)第四单元
  5. 微信小程序开发系列二:微信小程序的视图设计
  6. SAP CRM 和 Cloud for Customer 的 Document flow API 介绍
  7. mysql qps提升_上亿数据MYSQL的innodb优化 QPS轻松过5000
  8. zoom怎么解除静音_ZOOM视频软件使用指南(学生端)
  9. php 检查字符串类型,PHP之字符串类型与检验
  10. 两两交换链表中的节点Python解法