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.调用函数 --享受 ...
随机推荐
- Redis 常用知识
Redis 介绍 Redis 一个开源的使用ANSI C语言编写.遵守BSD协议,内存中的数据结构存储系统,它可以用作Key-Value数据库.缓存和消息中间件,并提供多种语API. 支持多种数据结构 ...
- Python程序设计 测验易错题总结
1.温度转换 t=input() if t[-1]=="J": t=int(t[:-1]) t1=t/4.186 print("%.3fcal"%t1) els ...
- go笔记--json包使用
目录 Marshal Unmarshal 处理json对象 @ json包实现了json对象的编解码,参见RFC 4627.Json对象和go类型的映射关系主要通过Marshal和Unmarshal函 ...
- UI_DEV_Environment 之 StoryBook
写在前面 由于本文主要集中关注与工具使用,所以不可能完全介绍工具的所有功能,所以要想了解更多,可以自己去各自官方网站上查看. github examples 什么是UI开发环境 UI开发环境专注于用户 ...
- docker升级步骤及注意事项
centos系统默认安装的docker版本是1.13版本,在安装部分镜像时可能出现兼容问题,本文通过实际操作总结Docker升级最新版本步骤及可能出现的问题,供各位参考. 环境:CentOS Linu ...
- 连接 sql
java连接sqlserver 1 创建 Dynamic Web Project项目 在WebContent/WEB-INF/lib中添加sqljdbc42.jar 2 在class文件里连接数据库 ...
- 初学Elasticsearch
首先启动elasticsearch.bat,然后安装node.js为了支持elasticsearch-head-master插件,之后在在该插件的目录打开命令行窗口,输入grunt server即可S ...
- CF#603 Div2
差不多半年没打cf,还是一样的菜:不过也没什么,当时是激情,现在已是兴趣了,开心就好. A Sweet Problem 思维,公式推一下过了 B PIN Codes 队友字符串取余过了,结果今天早上一 ...
- getOutputStream() has already been called for this response 从了解到解决
一.背景说明 在tomcat的localhost.log日志中时长见到 getOutputStream() has already been called for this respon ...
- 【西北师大-2108Java】第十一次作业成绩汇总
[西北师大-2108Java]第十一次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第13周学习指导及要求 实验目的与要求 (1)掌握事件处理的基本原理,理解其用途: (2)掌握AWT事件模型 ...