2010-08-05 8 views
0

파이썬에는 두 가지 정의 또는 메소드가 있습니다. 똑같은 시간에 그들을 실행하고 싶습니다. 원래 나는 forking을 사용하려고 시도했지만, 그 아이가 부모로부터 메모리를 유지했기 때문에, 필자는 파일에서 필요없는 여러가지 것을 쓰고있다. 그래서 스레딩으로 전환했습니다. 파이썬에서 스레딩

나는

import threading 
class test(threading.Thread) 
    def __init__(self,numA, list): 
      self.__numA=numA # (random number) 
      self.__list=list #(list) 
    def run(self): 
      makelist(self) 
      makelist2(self) 

makelist()makelist2() 사용 numAlist 비슷한 있습니다. 내 프로그램 I을 실행하면

x = test() 
x.start() 

: 그래서 그 대신

print list 

말의 이러한 정의/방법에서 나는 새로운 클래스 객체를 만든

주에서
print self.__list. 

()라고 __list 또는 __numA을 인식 할 수 없다는 속성 오류가 발생합니다.

나는 한동안이 일에 매달 렸습니다. 동시에 두 개의 메소드를 실행하는 다른 더 좋은 방법이있는 경우 (메소드가 전혀 연결되지 않은 경우)이를 알려주고 설명하십시오.

감사합니다.

+0

'test '의'makelist' 및'makelist2' 메소드입니까, 아니면 별도의 함수입니까? –

+0

"비슷한"은 우리에게 문제가 무엇인지 알 수 없습니다. 실행 한 코드와 생성 된 오류를 보여주십시오. – msw

+0

나는 내 코드를 보여줄 것이지만, 그 코드는 작동하기 때문에 할 수 없다. 또한, 나는 그것을 알아낼 수 있었다. 감사. – ykmizu

답변

0

몇 가지 :

A) 당신이 threading.Thread의 __init__ 메서드를 재정의 할 때 퍼팅하여 수행 할 수 있습니다 threading.Thread 자신을 초기화 할 필요가 반대 "threading.Thread .__ 초기화 __ (자체) "__init__ 함수의 끝에

B)"makelist "및"makelist2 "에 대한 호출은 세계적인 함수 인 것 같습니다. 은 스레딩의 목적을 무효화합니다. 나는 그것들을 테스트 기능으로 만들 것을 권한다.

1

makelist와 makelist2가 동일한 클래스의 멤버가 아닌 경우 __list 및 __numA는 표시되지 않습니다. 일하는 것이 두 가지 주요 밑줄없이 __a 뭔가를 명명,

>>> class A(object): 
... def __init__(self): 
...  self.__a = 2 
... 
>>> def f(x): 
... print x.__a 
... 
>>> a = A() 
>>> f(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
AttributeError: 'A' object has no attribute '__a' 

을하지만 : 이중 밑줄이 같은 일을 실패하게됩니다. 그게 당신이보고있는 것입니까?

private variables에 대한 자세한 내용은 python 설명서를 참조하십시오.

1

먼저 변수에 내장 된 유형 또는 함수 (예 : list)의 이름을 지정하지 마십시오.

둘째. 다른 사람들이 지적한 문제들 (__ 이름 맹 글링, 초기화 스레드 등), makelist와 makelist2를 동시에 실행하고 실행 방법이 잘못되어 있다면 다른 하나. 별도의 스레드에서 실행해야하며 동일한 스레드에서 순차적으로 실행해야합니다.

세 번째로 "정확한 정확한 시간"이란 정확히 어떻게 의미합니까? (C) Python에서 쓰레드를 사용하면 물리적으로 불가능합니다. 왜냐하면 실행은 바이트 코드 레벨에서 인터리빙 될 것이기 때문입니다.파이썬의 다른 버전 (Jython, IronPython 등)은 멀티 코어 시스템에서 정확히 같은 시간에 실행할 수 있지만, OS 스케줄러가 각각 시작할 때 제어 할 권한이 없습니다.

마지막으로 스레드간에 변경 가능한 개체를 공유하는 것은 좋지 않습니다. 두 스레드가 동시에 데이터를 변경하면 예측할 수없는 일이 발생할 수 있기 때문입니다. 잠금을 사용하거나 불변의 불변 데이터 또는 데이터 사본 만 전달하여이를 방지해야합니다. 교착 상태와 같이 조심하지 않으면 잠금을 사용하여 자체 문제점을 유발할 수도 있습니다.

+0

정말 고마워요! 나는 분리 된 실을 만들었고 효과가 있었다. – ykmizu

1

동일한 정확한 시간에 실행하고 싶습니다.

당신은 threading이 작업을 수행 할 수 없습니다 파이썬에서 Global Interpreter Lock은 하나의 스레드 만 언제든지 파이썬 코드를 실행할 수 있도록합니다 (스레드는 모든 sys.getcheckinterval() 바이트 코드를 전환됩니다). 대신 multiprocessing을 사용하십시오 :

from multiprocessing import Process 
import os 

def info(title): 
    print title 
    print 'module name:', __name__ 
    print 'parent process:', os.getppid() 
    print 'process id:', os.getpid() 

def f(name): 
    info('function f') 
    print 'hello', name 

if __name__ == '__main__': 
    info('main line') 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join()