2017-12-07 1 views
0

PYQT 코드를 실행하기 위해 Python3을 사용하고 있습니다. 동시에 Python3을 통해 수행 할 수없는 작업을 위해 Python2.7 코드를 호출해야합니다.다중 처리를 사용한 속도 비교. 프로세스 대 서브 프로세스. 열기 코드

나는 Popen을 통해 2.7 코드 실행을 구현했습니다. Popen에서 호출 할 때 2.7 코드를 실행하는 데 상당한 시간이 걸리지 만. 동일한 작업은 Python2.7에서 직접 실행하면 훨씬 빠르게 수행됩니다.

같은 목적으로 subprocess.Popen 대신 multiprocessing을 사용할 수 있습니까? 2.7 코드의 실행 속도를 향상시킬 수 있습니까? 그리고 이것이 적절한 경우; multiprocessing.Process에서 Python2.7 코드를 호출하는 올바른 방법은 무엇입니까? 또는 하나의 작업 만 실행하기 때문에 다중 프로세스를 사용하는 것이 낭비입니까?

답변

2

multiprocessing은 당신이 할 수 있도록하지 fork 프로세스, 이론적으로, 다른 인터프리터를 사용하여 멀리 multiprocessing을 해킹 할 수 비 POSIX 시스템 subprocess 유사하다. 그 시점에서 subprocess을 생성하고 multiprocessing.Process을 사용하는 사이에 성능 향상을 얻지 못할 것이므로 (실제로는 통신 오버 헤드가 multiprocessing.Process에 추가되어 느려질 수 있습니다.)

다른 인터프리터에서 실행해야하는 단일 태스크에 대해서만 이야기하는 경우 최대한 빨리 얻을 수 있습니다. 다른 인터프리터에서 실행될 여러 작업이있는 경우 다른 인터프리터를 실행하기 위해 단일 하위 프로세스를 생성 한 다음 multiprocessing을 사용하여 여러 작업을 코어에 분산 시켜도 여전히 multiprocessing.Process의 이점을 얻을 수 있습니다.

+0

설명해 주셔서 감사합니다. 따라서'multiprocessing.Process'를 사용할 때 이점은 없습니다. 나는'subprocess.Popen'에 비해 오버 헤드가 더 낫다고 생각했고 약간의 속도를 얻을 수있었습니다. 이 시점에서 나는 이미 최상의 시나리오를 가지고 있기 때문에 Python2.7 코드의 속도를 높이려고 노력할 것이다. 그것은 매우 교육적이었습니다. 감사! – rataplan

+0

@rataplan - 실행할 작업이 하나뿐이라면 속도 향상은 필요할 때까지 하위 프로세스를 잘 실행하고 데이터가 실행될 때까지 기다리는 것이 좋습니다 (또는 완전히 실행해야합니다.) 별도로 네트워크/파이프를 사용하여 작업을 '전송'). 그렇게하면 최소한 실행시 시스템이 처리 할 수있는만큼 빨리 작동합니다. 또한 하위 프로세스간에 많은 양의 데이터를 전송하지 않는 한 하위 프로세스 생성 오버 헤드는 무시할 수 있어야합니다 (잠시 후에 응답을 보지 않는 한) – zwer

+0

Thanks @zwer; 나는 총 2 개의 과정에서 달린다; 하나는 PyQT를 통해 QT UI를 실행 중이다. 다른 하나는 python2.7을 통해 코드를 실행합니다. 한번 완료되면 파이썬 3에서 호출자에게 결과를 보냅니다. 복사 된 데이터는 그리 많지 않습니다. 내가하는 모든 작업은 피클 객체에 저장된 모든 데이터를 전달하는 것입니다. 특별한 통찰력에 다시 한번 감사드립니다! – rataplan

관련 문제