수색…


비고

GIL (전역 인터프리터 잠금)으로 인해 파이썬 인터프리터의 인스턴스 하나만이 단일 프로세스로 실행됩니다. 따라서 일반적으로 멀티 스레딩을 사용하면 CPU 바운드 계산이 아니라 IO 바운드 계산이 향상됩니다. CPU 처리 작업을 병렬 처리하려면 multiprocessing 모듈을 사용하는 것이 좋습니다.

GIL은 Python뿐만 아니라 Python의 가장 보급 된 구현 인 CPython에도 적용됩니다. Jython 및 IronPython과 같은 다른 구현 에는 GIL이 없습니다 .

다중 처리 모듈을 사용하여 작업 병렬화

import multiprocessing

def fib(n):
    """computing the Fibonacci in an inefficient way
    was chosen to slow down the CPU."""
    if n <= 2:
        return 1
    else:
        return fib(n-1)+fib(n-2) 
p = multiprocessing.Pool() 
print(p.map(fib,[38,37,36,35,34,33]))

# Out: [39088169, 24157817, 14930352, 9227465, 5702887, 3524578]

fib 대한 각 호출의 실행이 병렬로 발생하기 때문에 전체 예제의 실행 시간은 이중 프로세서에서 순차적으로 수행되는 경우보다 1.8 배 빠릅니다 .

Python 2.2 이상

상위 및 하위 스크립트를 사용하여 코드를 병렬로 실행

child.py

import time

def main():
    print "starting work"
    time.sleep(1)
    print "work work work work work"
    time.sleep(1)
    print "done working"

if __name__ == '__main__':
    main()

parent.py

import os

def main():
    for i in range(5):
        os.system("python child.py &")

if __name__ == '__main__':
    main()

이것은 병렬, 독립적 인 HTTP 요청 / 응답 작업 또는 데이터베이스 선택 / 삽입에 유용합니다. 명령 줄 인수는 child.py 스크립트에도 제공 될 수 있습니다. 스크립트 간의 동기화는 모든 스크립트가 정기적으로 별도의 서버 (예 : Redis 인스턴스)를 확인하여 수행 할 수 있습니다.

C- 확장 기능을 사용하여 작업 병렬화하기

여기에있는 아이디어는 연산 집약적 인 작업을 Python과 독립적 인 C (특수 매크로 사용)로 이동시키고 C 코드가 작동하는 동안 GIL을 릴리스하도록하는 것입니다.

#include "Python.h"
...
PyObject *pyfunc(PyObject *self, PyObject *args) {
    ...
    Py_BEGIN_ALLOW_THREADS
    // Threaded C code
    ...
    Py_END_ALLOW_THREADS
    ...
}

PyPar 모듈을 사용하여 병렬 처리하기

PyPar는 Python에서 병렬 처리를 제공하기 위해 MPI (message passing interface)를 사용하는 라이브러리입니다. PyPar의 간단한 예제 ( https://github.com/daleroberts/pypar 에서 볼 수있다 ) 는 다음과 같다.

import pypar as pp

ncpus = pp.size()
rank = pp.rank()
node = pp.get_processor_name()

print 'I am rank %d of %d on node %s' % (rank, ncpus, node)

if rank == 0:
  msh = 'P0'
  pp.send(msg, destination=1)
  msg = pp.receive(source=rank-1)
  print 'Processor 0 received message "%s" from rank %d' % (msg, rank-1)
else:
  source = rank-1
  destination = (rank+1) % ncpus
  msg = pp.receive(source)
  msg = msg + 'P' + str(rank)
  pypar.send(msg, destination)
pp.finalize()


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow