python基础语法九-多进程和多线程

书接上回:

python基础语法一-基本数据类型

python基础语法二-多维数据类型

python基础语法三-类

python基础语法四-数据可视化

python基础语法五-函数

python基础语法六-正则匹配

python基础语法七-openpyxl操作excel

python基础语法八-异常

1. 多进程

1.1 创建多进程

1)import multiprocessing模块

2)创建进程要执行的函数

3)调用multiprocessing.Process(target=函数名,args=(函数要传入的参数)) #只有一个参数时,后面要加一个逗号

4)p.start()启动进程

5)p.join()等待进程结束

例 1.1 :

import multiprocessing

import os

def fun1(a):

print('id = {0}'.format(os.getpid()))

print('a = {0}'.format(a))

if name == 'main':

p1 = multiprocessing.Process(target=fun1, args=(5,))

p2 = multiprocessing.Process(target=fun1, args=(6,))

p1.start()

p2.start()

p1.join()

p2.join()

1.2 queue

1)作用:将每个进程执行的结果存放到queue里,最后所有进程结束后从queue里拿出结果。

2)用法:

(1)通过multiprocessing.Queue()创建q

(2)将q作为第一个参数传入到multiprocessing.Process()里

(3)通过q.put(结果)将结果放入q里

(4)在进程结束后通过q.get()拿出结果 #先放入的结果会被先拿出来

例1 .2 :

import multiprocessing

import os

def fun1(q, a):

print('id = {0}'.format(os.getpid()))

print('a = {0}'.format(a))

q.put(a)

if name == 'main':

q = multiprocessing.Queue()

p1 = multiprocessing.Process(target=fun1, args=(q,5))

p2 = multiprocessing.Process(target=fun1, args=(q,6))

p1.start()

p2.start()

p1.join()

p2.join()

res1 = q.get()

res2 = q.get()

print('res1 : {0}'.format(res1))

print('res2 : {0}'.format(res2))

1.3 pool

1)作用:将任务放入进程池,不用自己去调度cpu

例1. 3 :

import multiprocessing

def func1(a):

return a*a

if name == 'main':

pool = multiprocessing.Pool() # 默认会调度所有的 CPU

# pool = multiprocessing.Pool(processes=4) # 还可以指定调度 4 个(或其他个数) CPU

# 方式一: map---- 可以一次传入多个参数

results = pool.map(func1, range(10)) # 第一个参数:要调度的函数;第二个参数:输入参数的取值范围 ----- 最终 pool 自己会去调度 cpu 来计算范围内所有输入值的计算结果

print(results)

# 方式二: apply_async---- 一次只能传入一个参数

result = pool.apply_async(func1, (2,))

print(result.get())

# 那么针对这种方式只能利用 for 的迭代来完成多个参数的计算

results = pool.apply_async(func1, (i,)) for i in range(10)

print(result.get() for result in results) # 效果和方式一一样

1.4 shared memory

例1. 4 :

import multiprocessing

import time,os

def func1(a, shared_value):

for _ in range(6):

time.sleep(0.5)

shared_value.value += a

print('id : {0}, value : {1}\n'.format(os.getpid(), shared_value.value))

if name == 'main':

shared_value = multiprocessing.Value('i', 5) # 第一个参数:共享值的数据类型;第二个参数:共享值

p1 = multiprocessing.Process(target=func1, args=(1, shared_value))

p2 = multiprocessing.Process(target=func1, args=(3, shared_value))

p1.start()

p2.start()

p1.join()

p2.join()

# 在没有 lock 时,上述代码就会出现一个抢资源的混乱现象

1.5 lock

1)有了锁后,资源就不会出现混乱

例1 .5 :

import multiprocessing

import time,os

def func1(a, shared_value, lock):

lock.acquire() # lock

for _ in range(6):

time.sleep(0.5)

shared_value.value += a

print('id : {0}, value : {1}\n'.format(os.getpid(), shared_value.value))

lock.release() # 释放 lock

if name == 'main':

lock = multiprocessing.Lock()

shared_value = multiprocessing.Value('i', 5) # 第一个参数:共享值的数据类型;第二个参数:共享值

p1 = multiprocessing.Process(target=func1, args=(1, shared_value, lock))

p2 = multiprocessing.Process(target=func1, args=(3, shared_value, lock))

p1.start()

p2.start()

p1.join()

p2.join()

2. 多线程

例 2 :

import threading as td

def func1(a, b):

print('a + b = ', a+b)

if name == 'main':

t1 = td.Thread(target=func1, args=(1, 2)) # target: 执行的函数名称 agrs :执行的函数传参

t1.start() # start processing

t1.join() # wait process finished

相关推荐
默_笙4 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003964 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫4 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技4 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时4 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
奇思妙想聪明勤奋的小羊4 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1234 天前
2026年第38周GitHub趋势周报
python·科技·github
IZero074 天前
Jev 与 Laya
python·语言模型