Maison  >  Article  >  développement back-end  >  Introduction à l'apprentissage multi-processus Python

Introduction à l'apprentissage multi-processus Python

高洛峰
高洛峰original
2017-03-22 10:19:061032parcourir

Utilisation de base du multi-processus

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

Communication inter-processus

La mémoire n'est pas partagée entre différents processus. Pour réaliser l'échange de données entre deux processus, vous pouvez utiliser. Les méthodes suivantes

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

Partage de données entre processus

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

 

Verrouillage des processus

Lorsque plusieurs processus souhaitent accéder à des ressources partagées, le verrouillage peut éviter les conflits d'accès

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

Pool de processus

Pool de processus A La file d'attente des processus est maintenue en interne. Lorsqu'il est utilisé, un processus est obtenu à partir du pool de processus. S'il n'y a aucun processus utilisable dans le pool de processus, le programme attendra qu'il y ait un processus dans le pool de processus

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn