2017-12-26 86 views
12

이제 Windows에서 실행되는 C# 응용 프로그램을 개발 중입니다. 일부 프로세스는 pythonnet (Python for .NET)을 통해 호출되는 Python으로 작성됩니다. 프로세스가 계산량이 많기 때문에 병렬로 처리하고 싶습니다.Windows에서 Python for .NET을 사용하여 다중 처리를 수행하는 방법은 무엇입니까?

이들은 CPU 기반이며 독립적으로 처리 할 수 ​​있습니다.

는 지금까지 내가 아는 한, 그것을 실현하는 2 개 가지 방법이 있습니다 :

  1. 실행 여러 파이썬 런타임
    첫 번째 방법은 여러 파이썬 인터프리터를 출시하지만, 실행할 수없는 것 같다. pythonnet은 apaticallyly 정적 메서드, PythonEngine.Initialize()에 의해 초기화 된 하나의 인터프리터 만 관리 할 수 ​​있기 때문에. 임베딩에 대한
    From the Python.NET documentation:

    중요 참고 : 파이썬은 자유 스레드하지 않고 멀티 스레드 애플리케이션은 파이썬 인터프리터 안전하게 상호 작용 할 수 있도록 글로벌 통역 잠금을 사용합니다. 이것에 관한 더 많은 정보는 www.python.org 웹 사이트의 Python C-API 문서에서 얻을 수 있습니다.
    관리되는 응용 프로그램에 파이썬을 포함 할 때 C 또는 C++ 응용 프로그램에 파이썬을 포함 할 때와 같은 방식으로 GIL을 관리해야합니다.
    Python.Runtime 네임 스페이스에서 제공하는 개체 나 API와 상호 작용하기 전에 PythonEngine.AcquireLock 메서드를 호출하여 호출 코드가 Python 전역 인터프리터 잠금을 획득해야합니다. 이 규칙에 대한 유일한 예외는 PythonEngine.Initialize 메서드입니다.이 메서드는 시작시 GIL을 획득하지 않고 호출 할 수 있습니다. 파이썬
    다른 방법으로

  2. 를 사용하여 멀티 패키지는 멀티 패키지를 사용하고 있습니다. 코드가 Windows에서 실행되어 유한 프로세스가 생성되도록하려면 다음 문이 필요합니다. if __name__ == "__main__":
    그러나 Python으로 작성된 함수는 .NET에 포함되어 있기 때문에 모듈의 일부로 사용됩니다.
    예를 들어 다음 코드는 실행 가능하지만 프로세스를 무한대로 생성합니다. 위의 문제를 해결하는 것이 좋습니다

//C# 
static void Main(string[] args) 
    { 
     using (Py.GIL()) 
     { 
      PythonEngine.Exec(
       "print(__name__)\n" + //output is "buitlins" 
       "if __name__ == 'builtins':\n" + 
       " import test_package\n" + //import Python code below 
       " test_package.async_test()\n" 
       ); 
     } 
    } 
# Python 
import concurrent.futures 

def heavy_calc(x): 
    for i in range(int(1e7) * x): 
     i*2 

def async_test(): 
    # multiprocessing 
    with concurrent.futures.ProcessPoolExecutor(max_workers=8) as executor: 
     futures = [executor.submit(heavy_calc,x) for x in range(10)] 
     (done, notdone) = concurrent.futures.wait(futures) 
     for future in futures: 
      print(future.result()) 

있습니까? 의견을 보내 주시면 감사하겠습니다. 미리 감사드립니다.

+0

ProcessPool 하나 대신 ThreadPoolExecutor를 사용하는 것은 어떻습니까? – Evk

+0

그냥 atleast 한 번 언급해야 할 - 당신 pythton 물건을 C#으로 transalte 가능성과 사용하기 쉬운 Threadpools 등으로 행복합니까? :) "무한히 프로세스를 생성합니다." 이 과정들이 적어도 그들의 일을합니까? 그들은 sh ** 완료합니까? 그렇다면 문제는 프로세스의 끝없는 스폰입니다. 내가 무엇을 잘못하고 있는지 잘 모르겠다. (무한한 프로세스 생성을 제외하고) –

+0

@Evk 내가 포스트에서 언급했듯이 계산 프로세스는 CPU에 한정되어 있으므로 ThreadPoolExecuter가 더 빠르지 만 ProcessPool이 적합하다. 파이썬의 GIL. https://stackoverflow.com/questions/1226584/multiprocess-or-threading-in-python – sfb

답변

2

각 파이썬 호출의 경우 1. appDomain 을 만듭니다. 2. python을 비동기 적으로 실행할 작업을 appdomain에 만듭니다.

별도의 AppDomains이므로 정적 메서드는 독립적입니다.

AppDomain을 사용하여 만들기는 무겁기 때문에 호출 수가 매우 큰 경우에는 수행 할 수 없지만 비동기 적으로 실행하는 프로세스 수가 적어 질 수 있습니다.

+0

지금까지 appDomain을 몰랐습니다. 고마워요. 그것은 작동하는 것처럼 보이지만 얼마나 많은 프로세스가 매우 큰지에 해당하는지 잘 모르겠습니다 (물론 많은 요소에 따라 다릅니다). 나는 그것이 잘되는지 점검 할 것이다. – sfb

+0

나는 그렇게 생각한다. .. 복잡해 보인다. 행운을 빌어 라. – Ctznkane525

+0

그것이 효과가 있으면 대답을 받아 들일 수 있니? – Ctznkane525