Python之路46-多进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之路46-多进程相关的知识,希望对你有一定的参考价值。

多进程的基本使用

import multiprocessing
import os
import time


def run():
    print("父进程:%s,子进程:%s" % (os.getppid(), os.getpid()))
    time.sleep(2)

if __name__ == "__main__":
        p = multiprocessing.Process(target=run)
        p.start()
        p.join()


进程间通信

不同进程间内存是不共享的,要实现两个进程间的数据交换,可以用以下方法


Queue

import multiprocessing


def f(q):
    q.put(11111)

if __name__ == "__main__":
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=f, args=(q,))
    p.start()
    print(q.get())


Pipe

import multiprocessing


def f(conn):
    conn.send(1)
    conn.send(2)
    print(conn.recv())
    conn.close()

if __name__ == "__main__":
    parent_conn, child_conn = multiprocessing.Pipe()
    p = multiprocessing.Process(target=f, args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    print(parent_conn.recv())
    parent_conn.send(3)
    p.join()


进程间的数据共享

Manager

import multiprocessing
import os


def func(d, l):
    d[os.getpid()] = os.getpid()
    print(d)
    l.append(os.getpid())
    print(l)

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    d = manager.dict()
    l = manager.list()
    p_list = []
    for i in range(5):
        p = multiprocessing.Process(target=func, args=(d, l))
        p.start()
        p_list.append(p)
    for p in p_list:
        p.join()


进程锁

当多个进程要访问共享资源时,Lock可以避免访问冲突

import multiprocessing


def f(l, i):
    l.acquire()
    print("hello world", i)
    l.release()

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    for num in range(10):
        p = multiprocessing.Process(target=f, args=(lock, num))
        p.start()


进程池

进程池内部维护一个进程队列,当使用时,则去进程池中获取一个进程,如果进程池中没有可使用的进程,那么程序就会等待,直到进程池中有进程

import multiprocessing
import os
import time


def foo(i):
    time.sleep(2)
    print("in process", os.getpid())
    return i + 100


def bar(arg):
    print("==>exec done:", arg)

if __name__ == "__main__":
    pool = multiprocessing.Pool(5)
    for i in range(10):
        pool.apply_async(func=foo, args=(i,), callback=bar)
    print("end")
    pool.close()
    pool.join()


本文出自 “八英里” 博客,请务必保留此出处http://5921271.blog.51cto.com/5911271/1908709

以上是关于Python之路46-多进程的主要内容,如果未能解决你的问题,请参考以下文章

python之路——38

python之路-----多线程与多进度

12python全栈之路-并发编程之多进程

Python之路-进程

Python学习之路-随笔03 多线程/进程和协程(上篇)

百万年薪python之路 -- 并发编程之 多进程二