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

相关推荐
waterHBO25 分钟前
python 爬虫 selenium 笔记
爬虫·python·selenium
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
AIAdvocate3 小时前
Pandas_数据结构详解
数据结构·python·pandas
小言从不摸鱼3 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
FreakStudio5 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
redcocal7 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
artificiali7 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
RaidenQ7 小时前
2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘
图像处理·python·算法·课程设计
花生了什么树~.8 小时前
python基础知识(六)--字典遍历、公共运算符、公共方法、函数、变量分类、参数分类、拆包、引用
开发语言·python
Trouvaille ~8 小时前
【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
图像处理·python·机器学习·numpy·信号处理·时间序列分析·科学计算