Python进阶基础学习(多线程)
Python进阶学习笔记(一)
threading模块
threading.thread(target = (函数)) 负责定义子线程对象
threading.enumerate() 负责查看子线程对象
测试代码如下:
- import time
- import threading
- def sing():
- for i in range(5):
- print('-----唱歌-----')
- time.sleep(1)
- def dance():
- for i in range(5):
- print('-----跳舞-----')
- time.sleep(1)
- def main():
- t1 = threading.Thread(target=sing) #子线程1
- t2 = threading.Thread(target=dance) #子线程2
- t1.start()
- t2.start()
- while True:
- print(threading.enumerate())
- if len(threading.enumerate()) == 1:
- break
- time.sleep(1)
- if __name__ == '__main__':
- main()
补充:
线程的调度是随机的,主线程如果在子线程之前GG,你们子线程也GG
threading.thread()不会创建线程,只有调用其实例.start()之后才会创建线程
通过类来创建线程
测试代码如下:
- import threading
- import time
- class Person(threading.Thread):
- def run(self) -> None:
- for i in range(3):
- print('aaa' + self.name)
- time.sleep(1)
- if __name__ == '__main__':
- p = Person()
- p.start()
- for i in range(3):
- print('bbb')
- time.sleep(1)
补充:
threading.thread是一个类,通过继承并且override run函数,即可声明进程
多线程共享全局变量
测试代码如下:
- import threading
- import time
- num = 100
- def test1():
- global num
- num += 1
- print(num)
- def test2():
- print(num)
- def main():
- t1 = threading.Thread(target=test1)
- t2 = threading.Thread(target=test2)
- t1.start()
- time.sleep(1)
- test2()
- if __name__ == '__main__':
- main()
若创建线程是需要带参数,则是用args
测试代码如下:
- num = [1,1,2,3]
- def test1(args):
- args.append('hhs')
- print(args)
- def main():
- t1 = threading.Thread(target=test1,args=(num,))
- t1.start()
- print(num)
- if __name__ == '__main__':
- main()
补充:args后边传的是一个元组,少了逗号会报错
多线程共享全局变量出现的问题
测试代码如下:
- import threading
- import time
- g_num = 0
- def count1(n):
- global g_num
- for i in range(n):
- g_num += 1
- def count2(n):
- global g_num
- for i in range(n):
- g_num += 1
- def main():
- t1 =threading.Thread(target=count1,args=(100000,))
- t2 = threading.Thread(target=count2, args=(100000,))
- t1.start()
- t2.start()
- time.sleep(2)
- print('正常num为200000,实际num为%d' % g_num)
- if __name__ == '__main__':
- main()
补充:输出结果为:175586,与正常结果不相同
解析问题:
1.cpu是一句句执行的
2.若把g_num += 1解析成很多句,如果线程1只执行1-2句,第三句还没赋值回去,就调用了线程2,则会出现相加的结果不等于预期的结果
互斥锁threading.Lock()
用于解决上面共享全局变量的问题
变量名.acquire() 上锁
变量名.release() 解锁
给要执行的代码上锁,自己运行的时候别的线程无法运行
测试代码如下:
- import threading
- import time
- num = 0
- mutex = threading.Lock()
- def count1(n):
- global num
- for i in range(n):
- mutex.acquire()
- num += 1
- mutex.release()
- def count2(n):
- global num
- for i in range(n):
- mutex.acquire()
- num += 1
- mutex.release()
- def main():
- t1 =threading.Thread(target=count1,args=(100000,))
- t2 = threading.Thread(target=count2, args=(100000,))
- t1.start()
- t2.start()
- time.sleep(2)
- print('正常num为200000,实际num为%d' % num)
- if __name__ == '__main__':
- main()
Python进阶基础学习(多线程)的更多相关文章
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python入门基础学习 三
Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...
- Python入门基础学习 一
Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...
- python进阶强化学习
最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...
- Python入门基础学习(文件与异常处理)
Python基础学习笔记(七) 捕获异常的语法格式: 文件的基本操作: 打开文件 读.写文件 关闭文件 read方法 --读取文件: open函数的第一个参数是要打开的文件名(文件名区分大小写) 如果 ...
- Python入门基础学习(时间模块,随机模块)
Python基础学习笔记(六) time模块: 时间的三种表示方法: 1.格式化字符串 2.时间戳 用来表示和1970年的时间间隔,单位为s 3.元组 struct_time 9个元素 time的st ...
- Python入门基础学习(模块,包)
Python基础学习笔记(五) 模块的概念:模块是python程序架构的一个核心概念 每个以拓展名py结尾的python源代码文件都是一个模块 模块名同样也是一个标识符,需要符合标识符的命名规则 在模 ...
- Python入门基础学习(面向对象)
Python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...
- Python入门基础学习(函数)
Python基础学习笔记(三) 函数的概念: 所谓函数,就是把具有独立功能的代码块组织为一个小模块,在需要的时候调用 函数的使用包含两个步骤: 1.定义函数 --封装独立的功能 2.调用函数 --享受 ...
随机推荐
- 阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知
很多人都知道,阿里巴巴在2017发布了<阿里巴巴Java开发手册>,前后推出了很多个版本,并在后续推出了与之配套的IDEA插件和书籍. 相信很多Java开发都或多或少看过这份手册,这份手册 ...
- 二分查询-leetcode
二分查找-leetcode /** * * 278. First Bad Version * * You are a product manager and currently leading a ...
- DataGridView使用BindingNavigator实现简单分页功能
接上一篇<DataGridView使用自定义控件实现简单分页功能>,本篇使用BindingNavigator来实现简单分页功能.其实也只是借用了一个BindingNavigator空壳, ...
- C# -- 多线程向同一文件写入
1. 多线程向同一文件写入Log. public delegate void AsyncLog(string str1, string str2); private void Test() { Con ...
- Spring Boot 的静态资源处理
做web开发的时候,我们往往会有很多静态资源,如html.图片.css等.那如何向前端返回静态资源呢?以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要 ...
- pillow模块Image.crop()函数切割图片方法,参数说明
使用Image.crop()方法对图片进行切割. 参数: Image.crop(left, up, right, below) left:与左边界的距离 up:与上边界的距离 right:还是与左边界 ...
- 百度地图API 拖拽或点击地图位置获取坐标
function setPlace(map,myValue,callback){ function getAddress(){ var pp = local.getResults().getPoi(0 ...
- macOS Catalina Kernel panic 因为意外而重新启动
0x00 What's Happend? 我的 MacBook Air 在升级到 Catalina 之后,经常在休眠模式重启,随后在桌面上显示"因为意外而重新启动"的信息,以下是跟 ...
- Tomcat乱码或异常
一.控制台乱码 原因:Tomcat与Windows编码不一致导致 解决办法:首先找到conf/logging.properties文件,然后打开后找到“java.util.logging.Consol ...
- 如何使用coe_load_sql_profile.sql来固定sql profile
SQLT工具包含一个脚本,名字是 coe_load_sql_profile.sql,下面以用户SCOTT的EMP表为例,说明如何使用该脚本固定sql profile. 1. SQL> -- 对e ...