2011-02-07 8 views
3

여러 인스턴스에서 사용자가 생성 한 Python 응용 프로그램 (GUI 사용, PyQt4 사용)이 있습니다. 실행중인 모든 프로세스를 찾을 수파이썬 프로세스 간 통신

  • : 응용 프로그램 (몇 일 몇 시간에 대해) 약간 긴 실행 작업을 실행하는 데 사용됩니다, 그래서 내가 좋아하는 일을 할 것입니다 추가 "모니터링"응용 프로그램을 추가 기꺼이 다른 응용 프로그램의
  • 결국 중지, 일시 중지, 다시 시작하라고 말하고 응용 프로그램에 몇 가지 명령을 보내 (... 작업 완료, 비율, 오류 메시지) 실행중인 작업의 상태를 가져 ...

작업에 적합한 한 가지 방법은입니다. 210, 유일한 문제는 내가 찾은 대부분의 RPC 라이브러리와 마찬가지로 TCP 소켓을 통해서만 작동하는 것 같습니다. 그러나 이것은 localhost에서만 수신 대기하는 여러 불필요한 소켓을 열어야하고 동일한 포트에서 수신 대기하려는 두 프로세스를 피하기 위해 일종의 포트 할당 메커니즘을 만들어야합니다. 그리고 나서 모니터는 어딘가에 쓰여지는 포트 목록을 필요로합니다. 또는 TCP 포트에서 수신 대기하고있는 프로세스를 찾아 올바른 애플리케이션 또는 인스턴스인지 여부를 파악하려고 시도합니다. 엉망진창처럼 들리네.

내가 생각할 수있는 상호 통신을 관리하는 가장 좋은 방법은 '유닉스 소켓'을 가지고있을 것입니다. '/var/run/myapp/myapp-.sock'에서 말한 다음, listMyApps()getMyApp(pid)과 같은 일부 메소드를 노출하는 모든 더러운 것들은 첫 번째 pid 목록을 반환하고 두 번째는 해당 앱과의 통신에 사용될 수있는 객체를 반환합니다.

지금, 나는 그것을 성취하는 가장 좋은 방법을 찾고 있습니다. 실제로, 유닉스 소켓을 통해 RPC를 관리하기 위해 이미 수행 한 작업은 무엇입니까? 나에게 이상하게 들리지만 맞는 것만 찾았습니다.

어떤 제안이 있으십니까?

참고 : 나는 모니터링 응용 프로그램 충돌의 경우,이 소켓에 연결하는 다른 응용 프로그램을 만들 날 무료시키는에 문제를 방지하기 위해 (응용 프로그램은 단일 모니터링 서버의 클라이언트이다) 일을 반대로하고 싶지 요청을합니다.

참고 : 보안 요청이 신뢰할 수있는 사용자 만하여 로컬 호스트에서 수행되며,이 모든 물건을 개인에서 실행되기 때문에, :) 폐쇄 및 네트워크 방화벽 문제가되지 않습니다, 플러스.

답변

2

나는 dbus-python을 사용하여 soultion을 찾았습니다. Qt4 메인 루프와 통합 할 수 있었지만 웹 사이트에서는 glib 만 지원되었다고합니다 (페이지가 업데이트되지 않았 음). 방금 qick 테스트를했는데 멋지게 작동하는 것 같습니다 (com.example.myapp.<pid>이라는 버스에 더미 함수를 적용하고 인스턴스를 나열하고 외부 클라이언트에서 연결).

그런 다음 "마스터"제어 응용 프로그램과 "관리자"응용 프로그램 간의 통신을 위해서만 TCP를 통해 RPyC를 사용할 수 있습니다.이 응용 프로그램은 컴퓨터의 인스턴스간에 "전환"과 매우 유사합니다.

일부 아스키 기술의 설명 : 사람이 관심이 있다면

+-------------------+      
| MASTER APP  |     +--------------------+ 
| on my workstation |------ RPyC --------| Server#0 Manager | 
+-------------------+     +--------------------+ 
     |          | | | 
    RPyC          | | '-- dbus ---[INSTANCE #0] 
     |          | '--- dbus ---[INSTANCE #1] 
    +--------------------+     '---- dbus ---[INSTANCE #2] 
    | Server#1 Manager | 
    +--------------------+ 
     | | | 
     | | '-- dbus ---[INSTANCE #0] 
     | '--- dbus ---[INSTANCE #1] 
     '---- dbus ---[INSTANCE #2] 

, 그냥 알려 주시면 너무 몇 가지 코드 예제/더 자세한 정보를 게시합니다 .. 무슨 의미가

+0

BTW, SO에서 사용하는 모노 스페이스 글꼴 monospace가 아니면 전혀 그렇지 않습니다. 아스키 아트는보기 흉한 것 같습니다 : ( – redShadow

+0

저는 지금도 똑같은 딜레마를 겪고 있습니다 - 가끔씩 사용자 컨트롤 (정지, 시작 등)이 필요한 여러 개의 장기 실행 프로세스가 독립적으로 생성되었습니다.이 답변은 ' 11. 여전히 dbus 솔루션을 권장 하시겠습니까? –

2

하지만이 같은 포트에서 수신하려고 두 프로세스 을 방지하기 메커니즘을 포트 할당의 어떤 종류를 만들 localhost 만에 을 듣고 여러 불필요한 소켓을 열 필요하고, 에 필요로 연결

아닙니다. 첫째, 소켓을 통해 대부분의 프로세스 간 통신이 작동하는 방식입니다. TCP 소켓 또는 UNIX 소켓. 그것은 기본적으로 (정확하게는 아님) 표준 출력 등을 할 때 여러분이하고있는 일입니다.

OS 신호를 사용할 수도 있습니다. 각 프로세스의 주요 스레드 만 신호 처리를 할 수 있다는 것을 명심해야하지만,이를 막지 않도록주의해야합니다.

그러나 어떤 방식 으로든 소켓 연결을 사용하는 것이 거의 없습니다.

+0

, 내가 돈 각 프로세스마다 다른 포트에 청취 소켓을 설치하고 싶습니다. 신호를 생각했지만 필자가 필요로하는 것만으로는 충분하지 않습니다. 다양한 응용 프로그램 기능에 대한 메소드를 순서대로 실행해야하므로 (완료 비율뿐만 아니라 훨씬 더 복잡한 세부 정보) 상태를 쿼리하거나 "사용자가 XYZ UI 단추를 클릭하는 것처럼"많은 작업을 수행합니다. – redShadow

2

또 다른 방법은 일종의 작업 제어 시스템을 갖고 응용 프로그램이 자체 프로세스를 시작하는 대신 작업을 시작하는 작업을 등록하도록하는 것입니다. 그런 다음 작업 제어 시스템이 시작된 작업을 모니터링합니다. 보너스로,이 디자인을 사용하면 미래의 어느 시점에서 여러 컴퓨터에 작업을 분산시킬 수 있습니다.

+0

예,이 좋은 대답입니다. 파이썬의 멀티 프로세싱 라이브러리를 살펴보십시오. – Falmarri

+0

"직업 통제 시스템"에 대해 무엇을 제안합니까? 이전 버전의 응용 프로그램은 주 응용 프로그램의 여러 스레드 (파이썬으로 처리하기 쉬운)를 생성했으며, 그와 통신 할 수있는 곳에서는 문제가 발생하면 별도의 프로세스를 사용하면 더 편리합니다. 응용 프로그램 자체에 버그가 생길 수 있습니다.) 그리고 경우에 따라 STOP/CONT로 일시 중지/다시 시작하는 프로세스도 있습니다. – redShadow

+1

다중 처리 라이브러리를 살펴보아야합니다. 거기에 당신을지도 할 수있는 좋은 예가 있습니다. – Falmarri