English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python에서 멀티 프로세싱

multiprocessing 패키지는 프로세스를 생성하는 함수를 지원합니다. 이는 새로운 서브 프로세스를 로드하고 실행하는 함수입니다. 다른 프로세스를 종료하거나 계속 실행하려면, 현재 프로세스는 스레드 모듈의 API와 유사한 API를 사용하여 기다려야 합니다.

소개

Multiprocessing을 사용할 때, 먼저 프로세스를 생성해야 합니다.프로세스객체. 그런 다음, 그 객체를 호출하여start()메서드.

예제 코드

from multiprocessing import Process
   def display():
      프린트('Hi !! I am Python')
      if __name__ == '__main__':
      p = Process(target=display)
      p.start()
      p.join()

이 예제에서는, 먼저 Process 클래스를 가져오고 이를 사용하여display()Process 객체를 시작합니다.

그런 다음, 이를 사용하여start()처리를 시작하고 이를 사용하여join()처리 완료.

함수에 인자를 전달할 수도 있습니다.

예제

from multiprocessing import Process
   def display(my_name):
   프린트('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:
         프린트('%s의立方은%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 ("Done")

출력 결과

Done
3 cube is 27
4 cube is 64
5 cube is 125
6 cube is 216
7 cube is 343
8 cube is 512

또한 여러 프로세스를 동시에 생성할 수도 있습니다.

이 예제에서는, 먼저 프로세스를 생성합니다.1만큼의 프로세스를 계산하면서, 두 번째 프로세스 process2이 숫자가 짝수인지 홀수인지 확인 중입니다。

예제

from multiprocessing import Process
def cube(x):
   for x in my_numbers:
   프린트('%s의立方은%s입니다' % (x, x)**3))
def evenno(x):
   for x in my_numbers:
   if x % 2 == 0:
   프린트('%s는 짝수입니다' % (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 ("Done")

출력 결과

3 cube is 27
4 cube is 64
5 cube is 125
6 cube is 216
7 cube is 343
8 cube is 512
4 is an even number
6 is an even number
8 is an even number
Done

流程之间的沟通

多处理支持管道和队列,这是进程之间的两种通信通道。

管子

在多处理中,当我们要在进程之间进行通信时,在这种情况下使用管道

예제

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

출력 결과

['hi !!! I am Python']

管道返回两个连接对象,它们代表管道的两端。每个连接对象都有两种方法send(),一种是recv()方法,另一种是方法。

이 예제에서는 먼저 메시지 "hi !! I am Python"를 인쇄하고 데이터를 공유하는 과정을 생성합니다.

s列

当我们需要在进程之间数据를 전달할 때, 그때는 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())

출력 결과

0
2
4
6
8

이 예제에서는 먼저 날씨가 짝수인지 확인하는 함수를 생성합니다. 숫자가 짝수라면 그것을 큐의 마지막에 삽입합니다. 그런 다음, 큐 객체와 프로세스 객체를 생성한 후 프로세스를 시작합니다.

마지막으로 큐가 비어 있는지 확인합니다.

숫자를 출력할 때, 먼저 큐 앞의 값을 출력한 후 다음 값을 출력하고 그런 다음 계속합니다.

이 경우, 한 번에 하나의 프로세스만 실행하고 싶다면 Lock을 사용합니다. 이는 다른 프로세스가 유사한 코드를 실행하는 것을 방지하는 데 시간이 차단한다는 의미입니다. 이 과정이 완료되면 락을 해제합니다.

Lock 메서드 사용 예제

예제

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

출력 결과

Hi Aadrika
Hi Adwaita
Hi Sakya
Hi Sanj

기록 중

다중 처리 모듈은 또한 로그 기록 모듈을 제공하여, 로그 기록 패키지가 락 기능을 사용하지 않는 경우 실행 중에 프로세스 간의 메시지가 혼합되지 않도록 보장합니다.

예제

import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(logging.INFO)
logger.warning('오류가 발생했습니다')

이 예제에서는 먼저 로그 기록 및 다중 처리 모듈을 임포트한 후 multiprocessing.log_to_stderr() 메서드를 사용합니다. 그런 다음 get_logger()을 호출하여 sys.stderr에 추가하고, 마지막으로 레코드 레벨을 설정하고 메시지를 전달합니다.

Elasticsearch 가이드