python 은 threading 을 사용 하여 스 레 드 함수 반환 값 을 가 져 오 는 실현 방법
threading 모듈 에서 제공 하 는 클래스:
Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。
threading 모듈 에서 제공 하 는 일반적인 방법:
threading.currentThread():현재 스 레 드 변 수 를 되 돌려 줍 니 다.
threading.enumerate():실행 중인 스 레 드 를 포함 하 는 list 를 되 돌려 줍 니 다.시작 전과 종료 후의 스 레 드 는 포함 되 지 않 습 니 다.
threading.activeCount():실행 중인 스 레 드 수 를 되 돌려 줍 니 다.len(threading.enumerate()과 같은 결과 가 있 습 니 다.
threading 모듈 에서 제공 하 는 상수:
threading.TIMEOUT_MAX 설정 threading 전역 시간 초과.
자,본문 시작:
최근 에는 python 으로 환경 구축 도 구 를 써 야 합 니 다.다 중 스 레 드 를 병행 하여 환경 각 부분 에 대해 작업 을 수행 하고 이 를 병행 하 는 작업 이 모두 실 행 했 는 지 여 부 를 알 아야 합 니 다.즉,이 조작 함수 의 반환 값 이 0 인지 여 부 를 판단 하 는 것 입 니 다.그러나 threading 은 각 스 레 드 함수 의 반환 값 을 얻 는 방법 을 명시 적 으로 제공 하지 않 았 기 때문에 스스로 손 을 쓸 수 밖 에 없 었 습 니 다.다음은 자신의 실현 방식 을 소개 하 겠 습 니 다.
처음에 실 행 된 조작 이 많 을 수 있 고 후속 적 으로 계속 보충 되 는 것 을 고려 하여 먼저 통용 되 는 다 중 스 레 드 실행 류,스 레 드 작업 의 기본 적 인 방법 을 썼 습 니 다.다음 과 같 습 니 다.
import threading
class MyThread(object):
def __init__(self, func_list=None):
# , 0,
self.ret_flag = 0
self.func_list = func_list
self.threads = []
def set_thread_func_list(self, func_list):
"""
@note: func_list list, dict, func args
"""
self.func_list = func_list
def start(self):
"""
@note: ,
"""
self.threads = []
self.ret_flag = 0
for func_dict in self.func_list:
if func_dict["args"]:
t = threading.Thread(target=func_dict["func"], args=func_dict["args"])
else:
t = threading.Thread(target=func_dict["func"])
self.threads.append(t)
for thread_obj in self.threads:
thread_obj.start()
for thread_obj in self.threads:
thread_obj.join()
def ret_value(self):
"""
@note: , 0
"""
return self.ret_flag
MyThread 클래스 는 func 를 받 습 니 다.list 매개 변 수 는 하나의 dict 입 니 다.func 와 args 두 개의 key 가 있 습 니 다.func 는 진정 으로 실행 할 함수 참조 이 고 args 는 함수 의 매개 변수 입 니 다.그 중에서 가장 중요 한 방법 은 start 방법 입 니 다.모든 func 를 다 중 스 레 드 로 실행 한 다음 에 모든 스 레 드 가 실 행 될 때 까지 기 다 렸 다가 종료 합 니 다.다음 관건 은 self.ret 에 대해 어떻게 하 느 냐 하 는 것 입 니 다.flag 는 모든 스 레 드 함수 가 0 으로 되 돌 아 왔 는 지 여 부 를 판단 하기 위해 정확 한 값 을 설정 합 니 다.나의 실현 은 MyThread class 에 방법 을 쓰 는 것 이다 tracefunc,직접적인 스 레 드 함수 로 서 이 tracefunc 에서 진정 으로 실행 해 야 할 함 수 를 실행 하면 이 함수 의 반환 값 을 얻 을 수 있 습 니 다.self.ret 에 설정 합 니 다.flag。
이 tracefunc 의 첫 번 째 매개 변 수 는 실행 할 func 참조 이 고 그 다음은 이 func 의 매개 변수 입 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
def trace_func(self, func, *args, **kwargs):
"""
@note: profile_func, , ,
"""
ret = func(*args, **kwargs)
self.ret_flag += ret
start 방법 에서 Thread 함수 의 설정 을 수정 해 야 합 니 다.코드 는 다음 과 같 습 니 다.
def start(self):
"""
@note: ,
"""
self.threads = []
self.ret_flag = 0
for func_dict in self.func_list:
if func_dict["args"]:
new_arg_list = []
new_arg_list.append(func_dict["func"])
for arg in func_dict["args"]:
new_arg_list.append(arg)
new_arg_tuple = tuple(new_arg_list)
t = threading.Thread(target=self.trace_func, args=new_arg_tuple)
else:
t = threading.Thread(target=self.trace_func, args=(func_dict["func"],))
self.threads.append(t)
for thread_obj in self.threads:
thread_obj.start()
for thread_obj in self.threads:
thread_obj.join()
이렇게 하면 반환 치 를 성공 적 으로 얻 을 수 있 습 니 다.실험:
def func1(ret_num):
print "func1 ret:%d" % ret_num
return ret_num
def func2(ret_num):
print "func2 ret:%d" % ret_num
return ret_num
def func3():
print "func3 ret:100"
return 100
mt = MyThread()
g_func_list = []
g_func_list.append({"func":func1,"args":(1,)})
g_func_list.append({"func":func2,"args":(2,)})
g_func_list.append({"func":func3,"args":None})
mt.set_thread_func_list(g_func_list)
mt.start()
print "all thread ret : %d" % mt.ret_flag
마지막 출력 결과
func1 ret:1
func2 ret:2
func3 ret:100
all thread ret : 103
총결산위 에서 말 한 것 은 소 편 이 소개 한 python 이 threading 을 사용 하여 스 레 드 함수 반환 값 을 얻 는 실현 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.