Python多进程

作者: Recalcitrant | 来源:发表于2019-07-06 17:01 被阅读0次

目录:
一、进程的状态
二、进程的创建
三、进程间通信
四、进程池

Python并发之多进程

一、进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态:


  • 就绪态:运行的条件都已经满足,正在等在cpu执行。
  • 执行态:cpu正在执行该进程。
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态。

二、进程的创建

import multiprocessing
import time
import os


def run(name):
    time.sleep(2)
    print("进程{}启动...".format(name))
    print("进程{} ID:{}".format(name, os.getpid()))
    print("进程父ID:{}".format(os.getppid()))


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=run, args=("p1",))
    p2 = multiprocessing.Process(target=run, args=("p2",))
    p1.start()
    p2.start()
    p1.join()      # 等待进程p1执行完毕
    p2.join()      # 等待进程p2执行完毕
    print("All processes finished...")
    print("主进程ID:{}".format(os.getpid()))
运行结果

三、进程间通信

1.Queue队列

示例:

from multiprocessing import Process, Queue
q = Queue(10)


def producer(q):
    print(id(q))
    for i in range(100000):
        q.put(i)


def consumer(q):
    print(id(q))
    for i in range(100000):
        data = q.get()
        print(data)


if __name__ == "__main__":
    p = Process(target=producer, args=(q,))
    c = Process(target=consumer, args=(q,))
    p.start()
    c.start()

四、进程池

示例:

from concurrent.futures import ProcessPoolExecutor
import os
import time


def task(n):
    print('进程ID:%s is running...' % os.getpid())
    time.sleep(2)
    return n**2


if __name__ == '__main__':
    p = ProcessPoolExecutor()         # 不填则默认为CPU的个数
    l = []
    t0 = time.time()
    for i in range(20):
        obj = p.submit(task, i)       # submit()方法返回的是一个future实例,要得到结果需要用obj.result()
        l.append(obj)

    p.shutdown()        # 类似用from multiprocessing import Pool实现进程池中的close及join一起的作用

    print([obj.result() for obj in l])
    ts = time.time()
    print("耗时:", ts - t0)
运行结果

相关文章

网友评论

    本文标题:Python多进程

    本文链接:https://www.haomeiwen.com/subject/ctebcctx.html