2012-04-24 3 views
2

Windows에서 실행 파일을 실행하는 파이썬 스크립트를 업그레이드하려고하며 여러 스레드 프로세스를 사용하는 버전으로 텍스트 출력 파일을 관리하므로 하나 이상의 코어를 활용할 수 있습니다. 각 스레드가 액세스 할 수있는 네 가지 개별 버전의 실행 파일이 있습니다. 이 부분은 잘 작동합니다. 문제가 발생하는 곳은 동시에 실행되고 출력 파일의 내용에 따라 올바르게 실행되고 반응하는지 확인하기 위해 (다른) 출력 파일을 열려고 할 때입니다. 특히실행 파일을 실행하기위한 파이썬 다중 스레드 프로세스

, 하나는 일을 계속하면서, 다음과 같은 오류와 충돌합니다 세 개의 스레드, 두 가지를 실행할 때 :

Exception in thread Thread-4: 
Traceback (most recent call last): 
    File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 782, in run 
    conf = self.conf_file(Run) 
    File "E:\HDA\HDA-1.0.1\Hm-1.0.1.py", line 729, in conf_file 
    l = open(self.run_dir(Run)+Run, 'r').readlines()  #list of file lines 
IOError: [Errno 2] No such file or directory: 'Path/to/Outputfile' 

이 올바르게 실행 파일을 실행하지 않는 스레드의 결과 (즉, 왜 '경로 /로/Outputfile '이 생성되지 않아 찾을 수 없습니다). 그러나 스레드 중 하나는 올바르게이 작업을 수행하지만 다른 스레드는 수행 할 수 없습니다. 서로 다른 버전의 실행 파일을 실행하는 다중 스레드를 얻을 수없는 이유가 있습니까?

+3

스레드 사용 문제가 두 개 있습니다. "알겠습니다"라고 생각합니다. –

+1

현재 작업 디렉토리가 프로세스 와이드 속성이므로 일반적으로 os.chdir()을 호출하는 것이 좋습니다. – schlenk

답변

2

파일을 열어 이상한 교착 상태 또는 스핀 록 상태에 빠지지 않는 한 GIL만으로는이 자체를 죽이지 않을 것이라고 생각합니다. 일반적으로 과 같은 경우에 스레드를 필요로합니다. 사실 스레드가 동시에 실행될 수 있다는 사실은 파일을 여러 번 열지 않고 다른 스레드가 실패하는 데 기여한 것 같습니다.

On slide fifteen of this presentation, 글쓴이는 I/O 호출을 차단할 때 GIL이 다른 스레드에 기회를주기 위해 릴리스한다고 지적합니다.

여기 실제 문제는 파일 리소스에 대한 잠금 인 것 같습니다. Windows가 어떻게 작동하는지에 대해서는 잘 모르겠다. 그래서이 오류가 왜 사라지는 지 말할 수는 없지만 실제로는 파일 리소스에 대해 하나의 스레드 만 실제로 잠겨있는 것처럼 보입니다.

다른 포스터가 여러 개의 코어와 GIL에 관한 점은 다른 두 스레드가 굶어 죽는 곳에서 우선 순위 반전을 할 수 있다는 점에서 볼 수 있습니다. 그러나 위의 경우 프레젠테이션은 블로킹 작업 도중에 스레드가 다른 스레드에 대한 잠금을 해제한다고 말합니다.

하나의 생각은 multiprocessing입니다. 스레드보다는 여러 프로세스에서 파일을 읽는 것이 더 나을 것입니다. 내가 그것을 실행할 때

import multiprocessing 
import os 

def open_file(x): 
    with open(x, 'r') as file_obj: 
    return file_obj.readlines() 

a = multiprocessing.Pool(4) 
print a.map(open_file, ['test']*4) 

여기 결과입니다 : 여기

는 내가 쓴 내 OS 10.7.3 시스템에서 시도 예, 그것은 내용이 있습니다 lol\n 파일 test을 열어

➜ ~ git:(master) ✗ python open_test.py 
[['lol\n'], ['lol\n'], ['lol\n'], ['lol\n']] 
1

Global Interpreter Lock 때문에 파이썬은 현재 여러 개의 코어를 사용할 수 없습니다. 멀티 스레딩은 어려움을 겪을 수 있습니다. 어쨌든 가능한 경우 여러 프로세스를 사용하는 것이 좋습니다.

관련 문제