python并发

1. python多进程简述

2018-12-24  本文已影响16人  花间派I风月

一、多进程概述


二、通过调用multiprocessing.Process实现多进程

import timefrom multiprocessing import Process
def sing(name):
    for i in range(10):
        print(name+"唱歌")
        time.sleep(1)

def dance():
    for i in range(10):
        print("跳舞")
        time.sleep(1)

if __name__ == '__main__':
    p1 = Process(target=sing, args=('林志凌',), name="sing")
    p2 = Process(target=dance , name="dance")
    p1.start()
    print(p1.name)
    p2.start()
    print(p2.name)
    p1.join() #join() 主进程等待子进程结束
    p2.join()
  • p.start():启动进程,并调用该子进程中的p.run()
  • p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
  • p.terminate() 强制终止进程p,不会进行任何清理操作
  • p.is_alive() 如果p仍然运行,返回True,用于判断进程是否在运行
  • p.join([timeout]) 主进程等待子进程结束,timeout是可选的超时时间。
  • name:当前进程实例别名,默认为Process-N,N从1开始递增
  • pid:当前进程实例的PID值

三、通过继承Process类创建多进程

import multiprocessing
import time

class ClockProcess(multiprocessing.Process):
    def __init__(arg):
        super().__init__()
        self.arg = arg
    def run(self):
        n = self.arg
        while n>0:
            print(n)
            time.sleep(1)
            n -= 1

if __name__ == '__main__':
    p = ClockProcess(5)
    p.start()
    p.join()

四、进程池-Pool

from multiprocessing import Pool
import random, time
def work(num):
    print(random.random() * num)
    time.sleep(3)

if __name__ == '__main__':
    po = Pool(4)  #如果不写默认为当前CPU核数
    for i in range(10):
        po.apply_async(work, (i,))
    po.close()
    po.join()
  • apply_async(func[, args[, kwgs]]):使用非阻塞方式调用fun(并行执行,阻塞方式必须等上一个进程退出才能执行下一个进程)args为传递给func的参数列表,kwgs为传递给func的关键字参数列表;
  • apply(func[, args[, kwgs]]) (了解即可几乎不用)使用阻塞的方式调用func
  • close():关闭Pool,使其不再接受新的任务;
  • terminate():不管任务是否完成,立即终止;
  • join():主进程阻塞,等待子进程退出,必须在close()或terminate之后使用;

五、 进程间通信-Queue

import time
from multiprocessing import Queue, Process

def write(q)
    for value in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']:
        print("开始写入:", value)
        q.put(value)
        time.sleep(1)

def read(q):
    while True:
        if not q.empty():
            print("读取到的是", q.get())
            time.sleep(1)
        else:
            break

if __name__ == '__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    pw.start()
    time.sleep(1)
    pr.start()
    pw.join()
    pr.join()
    print('接收完毕!')

六、进程池之间通信- Manager().Queue()

RuntimeError: Queue objects should only be shared between processes through inheritance.

import time 
from multiprocessing import Manager, Pool

def writer(q):
    for i in "welcome":
        print("开始写入", i)
        q.put(i)

def reader(q):
    time.sleep(3)
    for i in range(q.qsize()):
        print("得到消息", q.get())

if __name__ == "__main__":
    print("主进程启动")
    q = Manager().Queue()
    po = Pool()
    po.apply_async(writer, (q,))
    po.apply_async(reader, (q,))
    po.close()
    po.join()
上一篇下一篇

猜你喜欢

热点阅读