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进阶基础学习(多线程)的更多相关文章

  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. 前端小白webpack学习(三)

    不写不知道,一写发现自己真是罗里吧嗦,尽量改进 之前写了webpack的主要概念和一些使用,今天再记一下webpack的plugins和loaders的使用 7.webpack plugins使用 例 ...

  2. Shell命令的执行优先级

    Shell内置命令.外部命令.别名.函数.保留关键字的优先级 在Shell中,有5种可调用的东西:别名(alias).函数(function).shell保留关键字.shell内置命令.外部命令. 如 ...

  3. Koa 本地搭建 HTTPS 环境

    openssl 首先本地需要安装 openssl,用于生成自签名证书. $ brew install openssl 检查安装: $ openssl version LibreSSL 2.6.5 生成 ...

  4. Redis Python(二)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.NoSQL(Not only SQL)1.泛指非关系数据库2.不支持SQL语法3.存储结构与传统的关系型数据库 ...

  5. JS---DOM---点击操作---part2---14个案例

    案例1:点击按钮禁用文本框 <input type="button" value="禁用文本框" id="btn" /> < ...

  6. sql server数据库查询取出重复数据记录

    问题:博主在2011年6月,广东技术师范大学大四的时候,从学校计算机科学学院网站看到招聘信息并到广东中原地产IT部面试,很清楚记得当时的面试题目:怎么从数据库里面查询重复记录. 解决方案:在sql s ...

  7. qcom 8953平台 LCD亮灭屏流程及LCD知识点总结【转】

    一.LK中亮屏流程 gcdb_display_init(),进行display初始化的起始地方: oem_panel_select(),在这里去选择哪一款屏,也可以在这里添加新一款屏: dsi_pan ...

  8. 线上cpu使用率过高解决方案

    一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top命令得到 ...

  9. November 10th, Week 45th, Sunday, 2019

    Perfection has no place in love. 爱从不完美. Perfection has no place in love, and we should always try to ...

  10. Django django-cors-headers实现防跨域

    安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE ...