English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
多处理程序包支持生成过程。它是指加载和执行新的子进程的函数。为了让孩子终止或继续执行并发计算,则当前进程必须使用类似于线程模块的API等待。
当我们使用Multiprocessing时,首先要创建过程对象。然后,它调用一个start()
方法。
from multiprocessing import Process def display(): print('Hi !! Je suis Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
在此示例中,首先我们导入Process类,然后使用该display()
函数启动Process对象。
然后,用start()
方法开始处理,然后用该join()
方法完成处理。
我们还可以使用args关键字将参数传递给函数。
from multiprocessing import Process def display(my_name): print('Hi !!!') + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
在此示例中,我们创建一个过程,该过程计算数字的立方并将所有结果打印到控制台。
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube est %s' % (x, x)**3)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] p = Process(target=cube, args=('x',)) p.start() p.join print ("Terminé")
Résultat de la sortie
Terminé 3 le cube est 27 4 le cube est 64 5 le cube est 125 6 le cube est 216 7 le cube est 343 8 le cube est 512
我们也可以一次创建多个流程。
在此示例中,首先我们创建一个进程,即process1,该进程仅计算一个数字的立方,与此同时,第二个进程process2正在检查该数字是偶数还是奇数。
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube est %s' % (x, x)**3)) def evenno(x): for x in my_numbers: if x % 2 == 0: print('%s est un nombre pair' % (x)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] my_process1 = Process(target=cube, args=('x',)) my_process2 = Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join() print ("Terminé")
Résultat de la sortie
3 le cube est 27 4 le cube est 64 5 le cube est 125 6 le cube est 216 7 le cube est 343 8 le cube est 512 4 est un nombre pair 6 est un nombre pair 8 est un nombre pair Terminé
Le traitement multiprocessus prend en charge les tubes et les files d'attente, qui sont deux canaux de communication entre les processus.
Dans le traitement multiprocessus, lorsque nous devons communiquer entre des processus, dans ce cas, utilisezLe tube。
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print (parent_conn.recv() ) p.join()
Résultat de la sortie
['hi !!! I am Python']
Le tube retourne deux objets connectés, représentant les deux extrémités du tube. Chaque objet connecté a deux méthodessend()
,une estrecv()
Méthode, une autre est méthode.
Dans cet exemple, tout d'abord, nous créons un processus qui affiche le message "hi !! I am Python", puis partage les données.
Lorsque nous transmettons des données entre des processus, à ce moment-là, nous pouvons utiliser l'objet Queue.
import multiprocessing def evenno(numbers, q): for n in numbers: if n % 2 == 0: q.put(n) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=evenno, args=(range(10), q)) p.start() p.join() while q: print(q.get())
Résultat de la sortie
0 2 4 6 8
Dans cet exemple, tout d'abord, créez une fonction pour vérifier si le temps est pair. Si le nombre est pair, insérez-le à la fin de la file. Ensuite, créez un objet file et un objet flux, puis démarrez le flux.
Enfin, vérifiez si la file d'attente est vide.
Lorsque nous imprimons des nombres, nous imprimons d'abord la valeur en tête de la file d'attente, puis la suivante, et ainsi de suite.
Dans ce cas, si nous voulons exécuter un seul processus à la fois, nous utilisons Locks. Cela signifie que le temps empêchera d'autres processus d'exécuter un code similaire. Une fois le processus terminé, le verrou est libéré.
from multiprocessing import Process, Lock def dispmay_name(l, i): l.acquire() print('Hi', i) l.release() if __name__ == '__main__': my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj'] for name in my_name: Process(target=dispmay_name, args=(my_lock, name)).start()
Résultat de la sortie
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
Le module de multiprocessus fournit également un module de journalisation pour s'assurer que si le paquet de journalisation ne utilise pas la fonction de verrouillage, les messages entre les processus se mélangent pendant l'exécution.
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Une erreur est survenue')
Dans cet exemple, tout d'abord, importez les modules de journalisation et de multiprocessus, puis utilisez la méthode multiprocessing.log_to_stderr(). Ensuite, appellez get_logger() et ajoutez-le à sys.stderr. Enfin, nous définissons le niveau du journaliste et transmettons des messages.