2013-02-21 3 views
0

프로세스에 넣을 수 있다면 약간의 속도를 얻을 수있는 독립적 인 스레드가 있습니다.Python3에서 Thread 클래스로 프로세스

클래스 x (스레드)를 def (self) : 클래스 x (프로세스)로 변경했는데 프로세스가 run()을 호출하지 않는 것 같습니다.

프로세스를 설정하는 올바른 구문은 무엇입니까?

def __init()__: 
    Process.__init()__(self, Target=self.run, args=(self,)): ??? 

답변

2

당신은 instance이 이전에 당신의 class x의 인스턴스로 설정 변수입니다 instance.start() 전화를 결여 될 수 있습니다.

좀 더 (코드) 문맥을 제공하면 대답하기가 더 쉽습니다. 내가보기에 새로운 스레드 또는 프로세스를 설정하고 시작하는 두 가지 다른 방법이 혼합되어 있습니다. 이것은 반드시 나쁜 것은 아니며 의도적 일 수 있습니다. 그러나 그렇지 않다면, 당신은 당신이 필요 이상으로 더 많은 것을 타이핑하고 있습니다.

한 가지 방법은 다음과 같습니다 f

p = Process(target=f, args=('bob',)) 
p.start() 
p.join() 

어떤 기능 것. 첫 번째 줄은 새로운 Process 인스턴스를 설정하고 두 번째 줄은 분기하고 따라서 (하위) 프로세스를 시작하고 p.join()이 완료 될 때까지 대기합니다. the documentation

두 번째 사용 예에서는 하위 클래스를 class Process으로 설정하고 생성자를 호출 할 때 일반적으로 target을 지정하지 않습니다. run은 실제로 process.start() 메서드를 호출 할 때 fork로 호출되는 기본 메서드입니다. 당신이 인수를하지 않아도 다음 하위 클래스에 대한 __init__ 생성자를 정의 할 필요가없는 경우

class MySubProcess(multiprocessing.Process): 
    def __init__(self, *args, **kwargs): 
     super().__init__(self) 
     # some more specific setup for your class using args/kwargs 
    def run(self): 
     # here's the code that is going to be run as a forked process 
     pass 

그런 다음

p = MySubProcess(any_args_here) 
p.start() 
p.join() 

으로 실행합니다.

두 가지 방법 모두 스레딩 스레드와 멀티 프로세싱간에 전환 할 수 있습니다. 코드 변경이 거의없는 프로세스 데이터 유형. 물론 데이터 공유가 작동하는 방식은 달라지며 통신은 스레드와 프로세스에 따라 다릅니다.

+0

고마워, 나는 대답을 직접 추가하기 위해 여기로 돌아왔다. 실제로는 작동하지 않는 것 같았다. 사실 run() 메소드 내부의 일식/pydev 중단 점이 문제를 일으켰다. print() 함수를 배치함으로써, 나는 무슨 일이 일어나고 있는지 알 수있었습니다. –

관련 문제