1

가, 3어떻게 파이썬에서 내가 스레드 내에서 실행 서브 루틴에서 반환 값을 추출하는 데 문제가

import threading 
from threading import Thread 
def dothis(): 
    x = 17 
    return x 

Thread(target = dothis).start() 

print(x) 

이 그냥 날을 제공하는 스레드 내에서 서브 루틴 실행에서 반환 값을 얻을 수 오류가 있으며 x가 정의되어 있지 않다고 말하면서 서브 루틴에서 반환했습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

+0

하나의 문제는 반환 값을 전혀 수집하지 않는다는 것입니다. 스레딩을하지 않아도 x는 반환 값을 x에 할당해야만 x가 값을 가질 수 있습니다. x는 dothis 함수의 범위에만 있기 때문입니다. 또한 다른 스레드를 시작했기 때문에 새 스레드와 전혀 동기화하지 않았기 때문에 print (x)가 발생하기 전에 실행이 완료되었는지 여부를 알 수 없습니다. – poompt

+0

대기열을 사용해야합니다 (예 : [이 답변] (https://stackoverflow.com/a/36926134/984421) 연결된 dup 질문. – ekhumoro

답변

0

x은 로컬 변수입니다. 이것은 dothis 함수의 범위 내에 만 존재합니다.

함수 외부에서 액세스하려는 경우 전역 변수로 지정해야합니다. 여러 스레드가 같은 글로벌 변수를 수정하려고 시도 할 수있는 경쟁 상태가 발생할 수 있기 때문에

x = 0 

def dothis(): 
    global x 
    x = 17 

그러나, 전역 변수 (안 상수)는 일반적으로 가난한 코드 디자인의 표시이며, 특히 스레드를 피해야한다 .

0

입력을 함수에 제공하고 동시에 여러 스레드를 실행하여 출력 값을 얻고 싶을 것 같습니다. 이런 식으로 뭔가 :만큼 이미 코드 X에 언급

import multiprocessing 

def dothis(x): 
    print x 
    #More Code 
    return x 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    InputsList = [1,2,3,4] 
    Processors = 4 
    pool = multiprocessing.Pool(Processors) 
    Results = pool.map(dothis, InputsList) 
    print Results 

는이 오류가 이유입니다, 함수 외부에서 정의되지 않았습니다. 입력은 주 함수 또는 전역 변수로 정의해야합니다.

원하는 기능에 입력 목록을 전달할 수 있으며 Results에는 반환 된 값 목록이 포함됩니다.

관련 문제