Python进阶学习笔记(一)

threading模块

threading.thread(target = (函数))  负责定义子线程对象

threading.enumerate()  负责查看子线程对象

测试代码如下:

  1. import time
  2. import threading
  3. def sing():
  4. for i in range(5):
  5. print('-----唱歌-----')
  6. time.sleep(1)
  7.  
  8. def dance():
  9. for i in range(5):
  10. print('-----跳舞-----')
  11. time.sleep(1)
  12.  
  13. def main():
  14. t1 = threading.Thread(target=sing) #子线程1
  15. t2 = threading.Thread(target=dance) #子线程2
  16. t1.start()
  17. t2.start()
  18. while True:
  19. print(threading.enumerate())
  20. if len(threading.enumerate()) == 1:
  21. break
  22. time.sleep(1)
  23. if __name__ == '__main__':
  24. main()

补充:

线程的调度是随机的,主线程如果在子线程之前GG,你们子线程也GG

threading.thread()不会创建线程,只有调用其实例.start()之后才会创建线程

通过类来创建线程

测试代码如下:

  1. import threading
  2. import time
  3. class Person(threading.Thread):
  4. def run(self) -> None:
  5. for i in range(3):
  6. print('aaa' + self.name)
  7. time.sleep(1)
  8.  
  9. if __name__ == '__main__':
  10. p = Person()
  11. p.start()
  12. for i in range(3):
  13. print('bbb')
  14. time.sleep(1)

补充:

threading.thread是一个类,通过继承并且override run函数,即可声明进程

多线程共享全局变量

测试代码如下:

  1. import threading
  2. import time
  3. num = 100
  4. def test1():
  5. global num
  6. num += 1
  7. print(num)
  8. def test2():
  9. print(num)
  10. def main():
  11. t1 = threading.Thread(target=test1)
  12. t2 = threading.Thread(target=test2)
  13. t1.start()
  14. time.sleep(1)
  15. test2()
  16. if __name__ == '__main__':
  17. main()

若创建线程是需要带参数,则是用args

测试代码如下:

  1. num = [1,1,2,3]
  2.  
  3. def test1(args):
  4. args.append('hhs')
  5. print(args)
  6.  
  7. def main():
  8. t1 = threading.Thread(target=test1,args=(num,))
  9. t1.start()
  10. print(num)
  11.  
  12. if __name__ == '__main__':
  13. main()

补充:args后边传的是一个元组,少了逗号会报错

多线程共享全局变量出现的问题

测试代码如下:

  1. import threading
  2. import time
  3.  
  4. g_num = 0
  5. def count1(n):
  6. global g_num
  7. for i in range(n):
  8. g_num += 1
  9.  
  10. def count2(n):
  11. global g_num
  12. for i in range(n):
  13. g_num += 1
  14.  
  15. def main():
  16. t1 =threading.Thread(target=count1,args=(100000,))
  17. t2 = threading.Thread(target=count2, args=(100000,))
  18. t1.start()
  19. t2.start()
  20. time.sleep(2)
  21. print('正常num为200000,实际num为%d' % g_num)
  22.  
  23. if __name__ == '__main__':
  24. main()

补充:输出结果为:175586,与正常结果不相同

解析问题:

1.cpu是一句句执行的

2.若把g_num += 1解析成很多句,如果线程1只执行1-2句,第三句还没赋值回去,就调用了线程2,则会出现相加的结果不等于预期的结果

互斥锁threading.Lock()

用于解决上面共享全局变量的问题

变量名.acquire()  上锁

变量名.release()  解锁

给要执行的代码上锁,自己运行的时候别的线程无法运行

测试代码如下:

  1. import threading
  2. import time
  3.  
  4. num = 0
  5. mutex = threading.Lock()
  6. def count1(n):
  7. global num
  8. for i in range(n):
  9. mutex.acquire()
  10. num += 1
  11. mutex.release()
  12.  
  13. def count2(n):
  14. global num
  15. for i in range(n):
  16. mutex.acquire()
  17. num += 1
  18. mutex.release()
  19.  
  20. def main():
  21. t1 =threading.Thread(target=count1,args=(100000,))
  22. t2 = threading.Thread(target=count2, args=(100000,))
  23. t1.start()
  24. t2.start()
  25. time.sleep(2)
  26. print('正常num为200000,实际num为%d' % num)
  27.  
  28. if __name__ == '__main__':
  29. main()

  

Python进阶基础学习(多线程)的更多相关文章

  1. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  2. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  3. Python入门基础学习 一

    Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...

  4. python进阶强化学习

    最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...

  5. Python入门基础学习(文件与异常处理)

    Python基础学习笔记(七) 捕获异常的语法格式: 文件的基本操作: 打开文件 读.写文件 关闭文件 read方法 --读取文件: open函数的第一个参数是要打开的文件名(文件名区分大小写) 如果 ...

  6. Python入门基础学习(时间模块,随机模块)

    Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...

  7. Python入门基础学习(模块,包)

    Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...

  8. Python入门基础学习(面向对象)

    Python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  9. Python入门基础学习(函数)

    Python基础学习笔记(三) 函数的概念: 所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用 函数的使用包含两个步骤: 1.定义函数 --封装独立的功能 2.调用函数 --享受 ...

随机推荐

  1. Linux之shell详解

    Shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界 ...

  2. ETCD:客户端v3

    原文地址:etcd/clientv3 etcd/clientv3是v3版本的Go etcd官方客户端 安装 go get go.etcd.io/etcd/clientv3 开始 创建客户端使用clie ...

  3. 自己总结numpy用法

    最近用numpy比较多,边用边自己总结用法. 1. 数组 1.1 生成 m行 * n列 的随机数组 import numpy as np # 生成 m行*n列 的随机数组 # np.random.ra ...

  4. config-server-bus动态更新配置

    config-server用来搭建配置中心,而配置信息一般使用gitlab仓库来存储,这样在你的配置发生改变时,不需要从新打包,而如果使用native的试,则需要从新打一个config-server的 ...

  5. Elasticsearch各版本的MSI安装包和Kibana各版本的zip包(Windows)

    elastic各产品下载列表页:https://www.elastic.co/cn/downloads/ 打开Elasticsearch的下载页后看到的是当前最新版本的安装界面,现在最新的版本是7.4 ...

  6. AES加密原理和AOE工程实践

    在AI业务的开发的过程中,我们常常需要对模型文件进行加密.我们从以下几个方面来说一说AES的加密原理以及AOE里的工程实践. 常见的加密算法 AOE对模型加密需求的思考 AES的加密原理 AOE工程实 ...

  7. MinU: v2 Vulnhub Walkthrough

    主机层面扫描: 22 和 3306 端口 3306 端口默认是MySQL端口,但是这里尝试爆破报错,最后通http访问发现非MySQL协议,而是一个http的服务 http的协议我们进行目录枚举下 枚 ...

  8. OpenStack与ZStack深度对比:架构、部署、计算、运维监控等

    摘要 OpenStack从2010年开源至今,已经走过9个年头,其正在进入主流企业市场,但该项目依然面临较难部署和管理的老问题.有一点是毫无疑问的,那就是OpenStack保持着高速增长的态势,超过5 ...

  9. Redis和MongoDB区别

    MongoDB 更类似 MySQL,支持字段索引.游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务.Redis 是一个开源(BSD许可)的,内存中的数据结 ...

  10. bat批处理执行python 的几种方式

    第一种方式:@echo off C: cd C:\Users\administrator\Desktopstart python apidemo.py exit第二种方式: start cmd /K ...