pythonスレッド戻り値の取得

9643 ワード

pythonスレッド戻り値の取得
  • 機能実現前の準備コード
  • threadingを書き換える.Threadクラス取得戻り値
  • ローカル変数を用いて戻り値
  • を取得する.
    実装前の準備コード
    def say_hello(i):
        return {"hello": i}
    
    def threading_get_return():
        vendorCode = []
        for i in range(1000):
            result = say_hello(i)
            vendorCode.append(result)
    
    if __name__ == '__main__':
    	threading_get_return()
    

    今はthreadingでget_returnメソッドで戻り値を取得します.pythonのスレッドは通常、戻り値を取得できませんが、実際のアプリケーションでスレッドを開くと、戻り値を取得する必要があります.以下に、戻り値を取得する方法を2つ提供します.
    上書きThreadクラス取得戻り値
    import threading
    class MyThread(threading.Thread):
    
        def __init__(self, func, args):
            threading.Thread.__init__(self)
            self.func = func
            self.args = args
            self.result = self.func(*self.args)
    
        def get_result(self):
            try:
                return self.result
            except Exception:
                # print(traceback.print_exc())
                return "threading result except"
    
    #	               
    
    def say_hello(i):
        return {"hello": i}
    
    def threading_get_return():
        vendorCode = []
        for i in range(1000):
            th = MyThread(say_hello, args=(i,))
            th.start()
            th_list.append(th)        
       	
    	for th in th_list:
        	th.join()
        	result = th.get_result()
            vendorCode.append(result)
    
    if __name__ == '__main__':
    	threading_get_return()
    
    

    この方法の欠点:速度が遅くて、偽のスレッドを開いたようで、慎重に使います.
    ローカル変数を使用した戻り値の取得
    import threading
    
    def say_hello(i, vendorCode):
        #  return {"hello": i}
        vendorCode.append({"hello": i})
    
    def threading_get_return():
        vendorCode = []
        for i in range(1000):
            th = threading.Thread(say_hello, args=(i, vendorCode))
            th.start()
            th_list.append(th)
            vendorCode.append(result)
       	
       	#	            join
    	for th in th_list:
        	th.join()
    
    if __name__ == '__main__':
    	threading_get_return()
    

    ローカル変数を使用するには、ここでjoinを必要とします.そうしないと、プライマリスレッドが完了し、say_の一部がある可能性があります.helloの戻り値はリストにappendされていません.
    この方法の欠点:戻り値がリストに追加されるなどのローカル変数に適用され、単一の戻り値の取得には適用されません.