工作生活

Python多进程

2019-07-06  本文已影响0人  Recalcitrant

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

Python并发之多进程

一、进程的状态

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


二、进程的创建

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)
运行结果
上一篇下一篇

猜你喜欢

热点阅读