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

Python의 프로세스 동기화 및 풀링

<시간/>

프로세스 간 동기화

멀티프로세싱은 API를 사용하여 생성 프로세스를 지원하는 패키지입니다. 이 패키지는 로컬 및 원격 동시성 모두에 사용됩니다. 이 모듈을 사용하여 프로그래머는 주어진 시스템에서 여러 프로세서를 사용할 수 있습니다. Windows 및 UNIX OS에서 실행됩니다.

모든 동등한 동기화 기본 요소가 이 패키지에 있습니다.

예시 코드

from multiprocessing import Process, Lock
   def my_function(x, y):
      x.acquire()
      print ('hello world', y)
      x.release()
      if __name__ == '__main__':
      lock = Lock()
   for num in range(10):
Process(target= my_function, args=(lock, num)).start()

여기서 하나의 인스턴스는 한 번에 하나의 프로세스만 표준 출력을 표시할 수 있도록 잠글 수 있습니다.

풀링

풀링에는 Pool 클래스를 사용합니다. 제출된 전체 작업을 수행할 프로세스 풀을 만들 수 있는 경우.

class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])

풀 개체는 작업자 풀을 제어하여 제출할 수 있는 작업을 선택하고 시간 초과, 콜백 및 병렬 맵 구현이 있는 비동기 결과를 지원합니다.

cpu_count()는 프로세스가 없음이고 initializer(*initargs)는 초기화가 없음이 아닐 때 이 함수가 호출하는 경우에 사용됩니다.

apply(func[, args[, kwds]])

이는 apply() 내장 함수와 동일합니다. 이것은 결과가 준비될 때까지 차단됩니다. 병렬로 수행하려면 apply_async() 메서드가 더 좋습니다.

apply_async(func[, args[, kwds[, callback]]])

결과 개체를 반환합니다.

map(func, iterable [, chunksize])

map()은 내장 함수이며 하나의 반복 가능한 인수만 지원합니다. 결과가 준비될 때까지 차단됩니다.

이 방법에서 iterable은 여러 개의 작은 덩어리로 나뉘고 이러한 작은 부분은 별도의 작업으로 프로세스 풀에 제출됩니다.

map_async(func, iterable[, chunksize[, callback]])

결과 개체를 반환합니다.

imap(func, iterable[, chunksize])

itertools.imap()과 동일합니다.

인수의 크기는 map()에서 사용한 것과 동일합니다.

imap_unordered(func, iterable[, chunksize])

이것은 재조정 반복자를 주문해야 한다는 점을 제외하고는 imap()과 동일합니다.

닫기()

작업자가 모든 작업을 완료하면 작업자가 프로세스를 종료합니다.

종료()

작업을 완료하지 않고 작업자 프로세스를 즉시 중지하려면 이 방법을 사용합니다.

가입()

join() 메서드를 사용하기 전에 close() 및 terminate() 함수를 사용해야 합니다.

클래스 multiprocessing.pool.AsyncResult

Pool.apply_async() 및 Pool.map_async()에 의해 반환됩니다.

get([timeout])

이 함수는 도착했을 때 결과를 반환합니다.

대기([시간 초과])

이 wait 함수를 사용하여 결과를 사용할 수 있을 때까지 또는 timeout 초가 지나갈 때까지 기다립니다.

준비()

이 함수는 호출이 완료되었는지 여부를 반환합니다.

성공()

이 함수는 오류 없이 호출이 완료되면 반환됩니다.

예시 코드

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 30 12:17:58 2018
@author: Tutorials Point
"""
from multiprocessing import Pool
import time
def myfunction(m):
return m*m
if __name__ == '__main__':
my_pool = Pool(processes=4) # start 4 worker processes
result = my_pool.apply_async(myfunction, (10,)) # evaluate "f(10)" asynchronously in a single process
print (result.get(timeout=1))
print (my_pool.map(myfunction, range(10))) # prints "[0, 1, 4,..., 81]"
my_it = my_pool.imap(myfunction, range(10))
print (my_it.next() ) # prints "0"
print (my_it.next() ) # prints "1"
print (my_it.next(timeout=1) ) # prints "4" unless your computer is *very* slow
result = my_pool.apply_async(time.sleep, (10,))
print (result.get(timeout=1) ) # raises multiprocessing.TimeoutError