python学习(十二)并发编程和装饰器

并发编程

  • 概述

非并发:

程序由单个步骤序列构成

包含独立子任务的程序执行性能低

 

并发:

异步、效率高

分解子程序、简化流程与逻辑

 

进程 process:

一个程序的执行实例

每个进程有自己的地址空间、内存、数据栈以及辅助数据

 

线程 thread:

同一进程之内,可被并行激活的控制流

共享相同上下文(空间地址、数据结构)

特点:

便于信息共享和通信

线程访问顺序差异会导致结果不一致(条件 race condition)

 

Python GIL 全局解释器锁:

global interpreter lock

python代码由虚拟机(解释器主循环)控制

主循环同时只能有一个控制线程执行

  • 多线程

(单线程)

import time

time.ctime()获取当前时间

time.sleep(n)沉睡n秒

print(f'{time.ctime}')不用format直接搞到手

_thread模块:(多线程)

特点:

没有控制进程结束机制

只有一个同步原语(锁)

功能少于threading 模块

_thread.start_new_thread(function, args, **kwargs = None)开始线程args必须是元组(4,)。函数不写括号

在主函数里面需要在写一次time.sleep(n)让主函数等等其他函数的执行。(也可以通过锁类来完成,但是很麻烦,所以被不常用了)

threading 模块:

.Thread 线程类:

构造:

.Thread(target = 目标函数, args = (参数, ))

自定义Thread派生类,重写run方法逻辑

 

.start() 启动线程

.join() 要求主线程等待

threading.current_thread().name 线程名称

 

.current_thread() 获取当前线程

 

threading.Lock同步原语:锁:

先声明lock = threading.Lock()

.acquire() 获得

.release() 释放

支持上下文操作 with lock:

(放在函数里)

 

  • 队列

queue 模块:

Queue FIFO:

.Queue(maxsize = 0)构造实例

.put(item, block = True, timeout = None)放入数据项(timeout就是过了这么长时间后自动结束)

.get(block = True, timeout = None) 获取数据项

.task_done() 声明当前队列任务处理完毕

.join() 队列所有项处理完毕前阻塞

 

LifoQueue LIFO栈,最后进最先出

PriorityQueue 优先队列

 

  • Multiprocess多进程

充分运用多核、多CPU的计算能力,适用于计算密集型任务

  • concurrent.futures 模块

ThreadPoolExecutor

ProcessPoolExecutor

 

装饰器

  • 概述

用于管理和增强函数和类行为的代码

提供一种在函数或类定义中插入自动运行代码的机制

特点:

更明确的语法

更高的代码可读性

更好的一致性

 

  • 编写

函数基础:

将函数赋给变量

将函数作为参数传递

函数嵌套及跨域访问

 

函数定义装饰器

装饰器参数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值