Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬의 다중 처리

<시간/>

multiprocessing 패키지는 생성 프로세스를 지원합니다. 새로운 자식 프로세스를 로드하고 실행하는 함수를 말합니다. 자식이 종료하거나 동시 연산을 계속하려면 현재 프로세스는 스레딩 모듈과 유사한 API를 사용하여 기다려야 합니다.

소개

Multiprocessing으로 작업할 때 처음에는 프로세스를 만듭니다. 물체. 그런 다음 start() 메서드를 호출합니다.

예시 코드

from multiprocessing import Process def display():print ('안녕 !! 저는 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()

이 예에서는 숫자의 세제곱을 계산하고 모든 결과를 콘솔에 인쇄하는 프로세스를 만듭니다.

예시 코드

멀티프로세싱 가져오기 프로세스 def cube(x):for x in my_numbers:print('%s 큐브는 %s' % (x, x**3)) if __name__ =='__main__':my_numbers =[3 , 4, 5, 6, 7, 8] p =프로세스(target=cube, args=('x',)) p.start()p.joinprint("완료")

출력

Done3 큐브는 274 큐브는 645 큐브는 1256 큐브는 2167 큐브는 3438 큐브는 512입니다.

한 번에 둘 이상의 프로세스를 생성할 수도 있습니다.

이 예에서 처음에는 process1이라는 하나의 프로세스를 만들고 이 프로세스는 숫자의 세제곱을 계산하는 동시에 두 번째 프로세스인 process2는 이 숫자가 짝수인지 홀수인지 확인합니다.

예시

멀티프로세싱 import Processdef cube(x):for x in my_numbers:print('%s 큐브는 %s' % (x, x**3))def evenno(x):for x in my_numbers:if x % 2 ==0:print('%s는 짝수' % (x)) if __name__ =='__main__':my_numbers =[3, 4, 5, 6, 7, 8] my_process1 =Process(target=큐브, args=('x',)) my_process2 =Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join()print( "완료")

출력

3 큐브는 274 큐브는 645 큐브는 1256 큐브는 2167 큐브는 3438 큐브는 5124는 짝수6은 짝수8은 짝수입니다.

프로세스 간 통신

멀티프로세싱은 프로세스 간의 두 가지 유형의 통신 채널인 파이프 및 큐를 지원합니다.

파이프

멀티프로세싱에서 프로세스 간 통신을 원할 때 그 상황에서 파이프 사용 중입니다.

예시

 from multiprocessing import Process, Pipe def myfunction(conn):conn.send(['hi!! 저는 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()

출력

['안녕!!! 나는 파이썬이다']

파이프는 두 개의 연결 개체를 반환하며 이는 파이프의 두 끝을 나타냅니다. 각 연결 개체에는 두 가지 메서드가 있습니다. 하나는 send()이고 다른 하나는 recv() 메서드입니다.

이 예에서는 처음에 프로세스를 만들고 이 프로세스에서 "hi!! I am Python"이라는 메시지를 출력한 다음 데이터를 공유합니다.

대기열

프로세스 간에 데이터를 전달할 때 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() 동안 q:print(q.get())

출력

02468

이 예제에서는 먼저 날씨 숫자가 짝수인지 확인하는 함수를 만듭니다. 숫자가 짝수이면 대기열 끝에 삽입하십시오. 그런 다음 대기열 개체와 프로세스 개체를 만든 다음 프로세스를 시작합니다.

마지막으로 대기열이 비어 있는지 확인합니다.

숫자를 인쇄할 때 먼저 대기열 앞에 있는 값을 인쇄한 다음 다음 대기열에 있는 값을 인쇄하는 식으로 진행합니다.

잠금

그 상황에서 한 번에 하나의 프로세스만 실행되기를 원할 때 Lock이 사용됩니다. 이는 시간이 다른 프로세스가 유사한 코드를 실행하는 것을 차단한다는 것을 의미합니다. 프로세스가 완료되면 잠금이 해제됩니다.

Lock 방법 사용 예

예시

 from multiprocessing import Process, Lockdef dispmay_name(l, i):l.acquire()print ('Hi', i) l.release()if __name__ =='__main__':my_lock =Lock() my_name =[ 'Aadrika', 'Adwaita', 'Sakya', 'Sanj']이름 my_name:Process(target=dispmay_name, args=(my_lock,name)).start()

출력

안녕 AadrikaHi AdwaitaHi SakyaHi Sanj

로깅

멀티프로세싱 모듈은 또한 로깅 패키지가 잠금 기능을 사용하지 않는 경우 실행 중에 프로세스 간의 메시지가 섞이도록 하는 로깅 모듈을 제공합니다.

예시

가져오기 멀티프로세싱, logginglogger =multiprocessing.log_to_stderr()logger.setLevel(logging.INFO)logger.warning('오류가 발생했습니다')

이 예제에서는 처음에 로깅 및 다중 처리 모듈을 가져온 다음 multiprocessing.log_to_stderr() 메서드를 사용합니다. 그리고 get_logger()를 호출하고 sys.stderr에 추가하고 마지막으로 로거 수준을 설정하고 메시지를 전달합니다.