우리는 작은 c 서버 응용 프로그램을 개발 중입니다. 서버 응용 프로그램은 일부 데이터 처리를 수행하고 클라이언트에 응답합니다. 데이터 처리 부분을 구성 가능하고 유연하게 유지하기 위해 우리는 스크립팅을하기로 결정했고 우리가 Python을 사용하기로 결정한 다양한 준비 모듈의 가용성을 기반으로 결정했습니다. 우리는 Python-C API를 사용하여 c와 python 사이에서 데이터를 보내고받습니다.Python-C API 동시성 문제
알고리즘은 다음과 같이 작동합니다 : -
- 서버는 클라이언트에서 일부 데이터를 수신하고,이 데이터는 C에서 만든 사전에 저장됩니다. 사전은 API 함수 인 PyDict_New()를 사용하여 생성됩니다. c. 입력은 API 함수 PyDict_SetItemString()을 사용하여 사전에 키 값 쌍으로 저장됩니다.
- 다음으로 python 스크립트 PyRun_SimpleString()을 실행합니다. 스크립트를 매개 변수로 전달합니다. 이 스크립트는 c에서 작성된 사전을 사용합니다. PyImport_AddModule() 메소드를 사용하여 스크립트에서 액세스 할 수있는 사전을 c로 작성합니다. 및 PyModule_AddObject();
- 우리는 데이터 처리 결과를 위에서 작성한 동일한 사전의 키 값 쌍으로 스크립트에 저장합니다. 그런 다음 C 코드는 스크립트가 실행 된 후 결과 변수 (키 - 값 쌍)에 액세스 할 수 있습니다.
우리가 직면하고있는 문제는 서로 다른 클라이언트에서 들어오는 동시 요청의 경우에 문제 . 다른 클라이언트에서 여러 요청이 들어올 때 우리는 참조 횟수 예외를 처리하는 경향이 있습니다. 사용자를 위해 들어오는 요청마다 해당 사용자에 대한 독립적 인 사전을 만듭니다. 이 문제를 극복하기 위해 우리는 PyRun_SimpleString()에 대한 호출을 포괄했습니다. PyEval_AcquireLock() 내에서; 및 PyEval_ReleaseLock();을 사용하지만 스크립트 실행이 차단 호출이됩니다. 따라서 스크립트 실행에 시간이 오래 걸리는 경우 다른 모든 사용자도 응답을 기다리고 있습니다.
가능한 최선의 방법을 제안하거나 잘못된 정보를 알려주십시오. 자세한 정보는 ping하십시오.
도움이나 도움을 받으실 수 있습니다.
Jane에게 문의 해 주셔서 감사합니다. 덧붙여 말하자면, 나는 그 함수를 호출했지만 여전히 작동하지 않을 것이다. – Will