首页  >  文章  >  后端开发  >  Python学习多进程介绍

Python学习多进程介绍

高洛峰
高洛峰原创
2017-03-22 10:19:061032浏览

多进程的基本使用

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()

   

以上是 Python学习多进程介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn