Python中的进程multiprocessing模块

版权声明:qq:1263351411 https://blog.csdn.net/u013008795/article/details/91404859

Python中的进程multiprocessing模块


由于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===")

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

Process进程类

  1. 构造方法 multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) #创建一个进程类对象

    • group:只能是None,设计只是为了兼容操作系统。
    • target:当前进程中的主线程运行的函数
    • name:进程名称
    • args:传递给函数的位置参数
    • kwargs:传递给函数的关键字参数
  2. Process常用的属性

    属性名称 含义
    name 进程名称
    daemon 是否是daemon进程
    pid 进程号,进程未启动前该值为None
    exitcode 进程的退出状态id。如果进程没有终止,返回None
    anthkey 进程身份密钥,进程初始化时会使用 os.urandom()为进程随机生成一个二进制字符串
  3. 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)

process_002

进程间同步

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

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

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

猜你喜欢

转载自blog.csdn.net/u013008795/article/details/91404859