이제 Windows에서 실행되는 C# 응용 프로그램을 개발 중입니다. 일부 프로세스는 pythonnet (Python for .NET)을 통해 호출되는 Python으로 작성됩니다. 프로세스가 계산량이 많기 때문에 병렬로 처리하고 싶습니다.Windows에서 Python for .NET을 사용하여 다중 처리를 수행하는 방법은 무엇입니까?
이들은 CPU 기반이며 독립적으로 처리 할 수 있습니다.
는 지금까지 내가 아는 한, 그것을 실현하는 2 개 가지 방법이 있습니다 :실행 여러 파이썬 런타임
첫 번째 방법은 여러 파이썬 인터프리터를 출시하지만, 실행할 수없는 것 같다. 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을 획득하지 않고 호출 할 수 있습니다. 파이썬
다른 방법으로를 사용하여 멀티 패키지는 멀티 패키지를 사용하고 있습니다. 코드가 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())
있습니까? 의견을 보내 주시면 감사하겠습니다. 미리 감사드립니다.
ProcessPool 하나 대신 ThreadPoolExecutor를 사용하는 것은 어떻습니까? – Evk
그냥 atleast 한 번 언급해야 할 - 당신 pythton 물건을 C#으로 transalte 가능성과 사용하기 쉬운 Threadpools 등으로 행복합니까? :) "무한히 프로세스를 생성합니다." 이 과정들이 적어도 그들의 일을합니까? 그들은 sh ** 완료합니까? 그렇다면 문제는 프로세스의 끝없는 스폰입니다. 내가 무엇을 잘못하고 있는지 잘 모르겠다. (무한한 프로세스 생성을 제외하고) –
@Evk 내가 포스트에서 언급했듯이 계산 프로세스는 CPU에 한정되어 있으므로 ThreadPoolExecuter가 더 빠르지 만 ProcessPool이 적합하다. 파이썬의 GIL. https://stackoverflow.com/questions/1226584/multiprocess-or-threading-in-python – sfb