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. 求连通块的面积 - BFS、DFS实现

    本文以Leetcode中695.岛屿的最大面积题目为基础进行展开(题目

  2. java map在JSTL EL中的小应用--<c:forEach>遍历Map<>泛型

    准 备 数 据 :(自己准备吧少年,考验你时候到了!!) /** 结构示意图: 类型: List集合 map对象 LIst集合 Person类对象 String name : int age mLis ...

  3. Java开发中解决Js的跨域问题

    主流方法有JSONP和CORS两种,这里记一下后者的方式,理论基础就是在请求的时候在http请求头中添加如下属性: //指定允许其他域名访问 Access-Control-Allow-Origin:h ...

  4. wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑

    wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~  错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...

  5. C语言——线性表及其应用

    程序要求 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度.2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68.3.建立一 ...

  6. vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

    一.页面刷新时,如何保持原有vuex中的state信息 页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 st ...

  7. css position:sticky的尝试

    前言 sticky这种设计效果是经常出现的,比如陶宝右侧的工具栏,当我们向下滚动到它的位置时,它就会黏住顶部跟随滚动,类似position: fixed的效果,只不过它的触发条件是当我们滚动到所在位置 ...

  8. Server基本语句的用法

    1.创建数据库 create database databaseName use databaseName go   /*  转到指定数据库 */ 2.创建表 create table tableNa ...

  9. Android项目实战之高仿网易云音乐创建项目和配置

    这一节我们来讲解创建项目:说道大家可能就会说了,创建项目还有谁不会啊,还需要讲吗,别急听我慢慢到来,肯定有你不知道的. 使用项目Android Studio创建项目我们这里就不讲解了,主要是讲解如何配 ...

  10. Android Studio的安装及第一次启动时的配置

    Android Studio的安装及第一次启动时的配置 一.下载Android Studio 百度搜索“Android Studio" 点击中文社区进入,选择最新版本下载. 下载后双击安装包 ...