Maison  >  Article  >  développement back-end  >  Explication détaillée de l'implémentation multi-processus en Python (avec exemples)

Explication détaillée de l'implémentation multi-processus en Python (avec exemples)

不言
不言avant
2018-10-20 14:56:094348parcourir

Le contenu de cet article est une explication détaillée de l'implémentation du multi-processus en Python (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

La fonction fork crée un processus enfant

Utilisation de base

Le système d'exploitation Linux fournit une fonction fork pour créer un processus enfant. fork() est situé dans le module os de Python.
Utilisez simplement le module OS importé.

import os
os.fork()

Chaque fois que la fonction fork() est appelée, le processus parent correspondant générera un processus enfant.
Par exemple, le code suivant :

import os
os.fork()
os.fork()
os.fork()

Après exécution, 8 processus seront générés.

La valeur de retour de la fonction fork()

La valeur de retour de la fonction fork() pour le processus enfant est toujours 0, tandis que la valeur de retour pour le processus enfant le processus parent est le pid du processus enfant (numéro de processus).

Instance

#!/usr/bin/env python
import os
import time

rt = os.fork()

if rt == 0:
    print(f"The child process is {os.getpid()} . His father is {os.getppid()}")  # os.getpid()获取当前进程进程号,os.getppid()获取当前进程的父进程号
    time.sleep(5)
else:
    print(f"The father process is {os.getpid()} . His father is {os.getppid()}")
    time.sleep(5)

print(f"Now the process is {os.getpid()} . His father is {os.getppid()}")

Résultat de l'exécution :

Explication détaillée de limplémentation multi-processus en Python (avec exemples)

Module Processus

Module d'importation

Python fournit également la bibliothèque multitraitement pour fournir une programmation multithread pour l'ensemble de la plateforme.

import multiprocessing

Processus simple

Le code suivant est un processus simple :

from multiprocessing import Process


def work(num):
    for i in range(10):
        num += 1
    print(num)
    return 0


def main():
    num = 1
    p1 = Process(target = work, args = (num,))
    p1.start()


if __name__ == '__main__':
    main()

Explication détaillée de limplémentation multi-processus en Python (avec exemples)

Ici, la classe Process est introduite à partir de la bibliothèque multitraitement.
p1 = Process(target = work, args = (num,)) crée un processus. La cible est la fonction pour effectuer la tâche, et args sont les paramètres reçus, qui doivent être donnés sous forme de tuples.
start() démarre le processus.
Il existe quelques méthodes pour les processus simultanés :

méthode de jointure

La méthode de jointure de Process est similaire au multi-threading. En attendant la fin du processus.
Utilisation : join(timeout).
En utilisant join(), le programme attendra la fin du processus avant de continuer avec le code suivant.
Si le paramètre timeout est ajouté, le programme attendra les secondes d'expiration avant de continuer à exécuter le programme suivant.

méthode close

close() est utilisée pour fermer le processus, mais elle ne peut pas fermer le processus enfant en cours d'exécution.

Classe de processus

Vous pouvez implémenter plusieurs processus en créant des classes :

from multiprocessing import Process
import time


class My_Process(Process):

    def __init__(self,num):
        Process.__init__(self)
        self.num = num

    def run(self):
        time.sleep(2)
        print(self.num)


def main():
    for i in range(10):
        p = My_Process(i)
        p.start()


if __name__ == '__main__':
    main()

Pool de processus

from multiprocessing import Pool
import time


def target(num):
    time.sleep(2)
    print(num)


def main():
    pool = Pool(3)
    for i in range(3):
        pool.apply_async(target,(i,))
    pool.close()
    pool.join()
    print('Finish!!!')


if __name__ == '__main__':
    main()

L'appel de la méthode join() sur l'objet Pool attendra que tous les processus enfants terminent leur exécution. Close() doit être appelé avant d'appeler join(). Après avoir appelé close(), de nouveaux processus ne peuvent pas être ajoutés.
Le num dans Pool(num) est le nombre de processus à y ajouter. Si le nombre de processus n'est pas spécifié, la valeur par défaut est le nombre de cœurs de processeur.

Les processus sont indépendants les uns des autres

Chaque processus dans plusieurs processus a une copie des variables et les opérations entre les processus ne s'affectent pas les unes les autres.

import multiprocessing
import time

zero = 0

def change_zero():
    global zero
    for i in range(3):
        zero = zero + 1
        print(multiprocessing.current_process().name, zero)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target = change_zero)
    p2 = multiprocessing.Process(target = change_zero)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(zero)

Résultat final de l'exécution :

Explication détaillée de limplémentation multi-processus en Python (avec exemples)

Si l'opération d'E/S sur le fichier est effectuée, plusieurs processus écriront dans le même milieu de fichier .

Queue

L'utilisation de Queue en multitraitement permet à différents processus d'accéder aux mêmes ressources.

from multiprocessing import Process, Queue
def addone(q):
    q.put(1)
def addtwo(q):
    q.put(2)
if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=addone, args = (q, ))
    p2 = Process(target=addtwo, args = (q, ))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(q.get())
    print(q.get())

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer