0
点赞
收藏
分享

微信扫一扫

Python中的进程multiprocessing模块


Python中的进程multiprocessing模块

文章目录

  • ​​Python中的进程multiprocessing模块​​
  • ​​Process进程类​​
  • ​​进程间同步​​


由于Python的GIL全局解释器锁存在,多线程未必是CPU密集型程序的好的选择。


多进程可以完全独立的进程环境中运行程序,可以较充分地利用多处理器。


但是进程本身的隔离带来的数据不共享也是一个问题。而且线程比进程轻量级。

  • Process类的设计遵循了Thread类的API,减少了学习难度,使用和线程Thread类差不多。
  • 注意:注意:多进程代码一定要放在​​__name__ == "__main__"​​ 下面执行。
  • 例子,使用多进程解决运行算法密集程序

import multiprocessing
import datetime

def calc(i):
sum = 0
for _ in range(1000000000): #10忆
sum += 1
return i,sum

if __name__ == "__main__":
start = datetime.datetime.now()
ps = []
for i in range(4):
p = multiprocessing.Process(target=calc,args=(i,),name="calc-{}".format(i))
ps.append(p)
p.start()

for p in ps:
p.join()
# print(p.name,p.exitcode)

print((datetime.datetime.now()-start).total_seconds())
print("===end===")

Python中的进程multiprocessing模块_多进程


上面示例中可以相比之前说到多线程快多了,是真正的并行。

Process进程类

  1. 构造方法 multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) #创建一个进程类对象
  • group:只能是None,设计只是为了兼容操作系统。
  • target:当前进程中的主线程运行的函数
  • name:进程名称
  • args:传递给函数的位置参数
  • kwargs:传递给函数的关键字参数
  1. Process常用的属性

属性名称

含义

name

进程名称

daemon

是否是daemon进程

pid

进程号,进程未启动前该值为None

exitcode

进程的退出状态id。如果进程没有终止,返回None

anthkey

进程身份密钥,进程初始化时会使用 os.urandom()为进程随机生成一个二进制字符串

  1. Process常用方法

常用方法

含义

start(self)

启动进程

run(self)

进程运行函数

join([timeout=None])

会产生一个阻塞,直到进程执行完成退出后返回True,

timeout超时时长。指定时长内未结束会返回False

is_alive()

是否是活动进程,进程是否活着

terminate()

终止进程,注意终止进程,进程会立即退出,退出处理程序和finally子句等将不会执行。

kill()

终止进程,和terminate类似,通常是在Unix系统上使用

close()

关闭进程流对象,释放资源,必须在join()活着terminate()方法后使用。即必须等进程运行完成后使用。

注意:关闭进程流对象后,进程id,状态等信息将无法使用,否则会报ValueError异常,但进程名称可以访问。

import multiprocessing
import threading

def calc(i):
try:
sum = 0
for _ in range(10000000): #10忆
sum += 1
return i,sum
finally:
print("我退出了")

if __name__ == "__main__":
process = multiprocessing.Process(target=calc,args=(1,),name="pro-1")
process.start()
print(process.name)
print(process.daemon)
print(process.ident)
print(process.pid)
# print(process.terminate())
# process.kill()
process.join()

print(process.exitcode) # 进程退出的状态码
print(process.authkey)
process.close()
print(process.pid)

Python中的进程multiprocessing模块_多进程_02

进程间同步

Python在进程间同步提供了和线程同步一样的类,使用方法一样,使用的效果也类似,不过进程间代价要高于线程间,而且系统底层实现是不通的。只不过Python屏蔽了这些不通之处,让用户简单使用多进程。

multiprocessing提供的同步类有:
* multiprocessing.Event
* multiprocessing.RLock
* multiprocessing.Lock
* multiprocessing.Condition
* multiprocessing.Semaphore
* multiprocessing.BoundedSemaphore
* mulitiprocessing.Queue #队列,多进程中使用的队列,先进先出
具体使用方法请参见线程中对应类的使用​​​线程同步与线程锁​​

multiprocessing还提供共享内存、服务器进程来共享数据,还提供了用于进程间通讯的Queue队列、Pipe管道。
通信方式不同
1. 多进程就是启动多个解释器进程,进程间通信必须序列化、反序列化
2. 数据的线程安全性问题(如果每个进程中没有实现多线程,GIL可以说没什么用了)


举报

相关推荐

0 条评论