67

Pythonでタプルまたは選択した値を親に返すスレッドを取得するにはどうすればよいですか?

4

13 に答える 13

68

スレッドを開始する前にQueue.Queueをインスタンス化し、それをスレッドの引数の 1 つとして渡すことをお勧めします。スレッドが終了する前に.put、引数として受け取ったキューの結果です。親は自由にでき.getます.get_nowait

キューは一般に、Python でスレッドの同期と通信を調整するための最良の方法です: キューは本質的にスレッドセーフで、メッセージを渡す手段であり、一般的にマルチタスクを編成するための最良の方法です!-)

于 2009-12-11T06:24:14.917 に答える
15

Queue インスタンスをパラメータとして渡してから、戻りオブジェクトをキューに .put() する必要があります。どのようなオブジェクトを配置しても、 queue.get() を介して戻り値を収集できます。

サンプル:

queue = Queue.Queue()
thread_ = threading.Thread(
                target=target_method,
                name="Thread1",
                args=[params, queue],
                )
thread_.start()
thread_.join()
queue.get()

def target_method(self, params, queue):
 """
 Some operations right here
 """
 your_return = "Whatever your object is"
 queue.put(your_return)

複数のスレッドに使用:

#Start all threads in thread pool
    for thread in pool:
        thread.start()
        response = queue.get()
        thread_results.append(response)

#Kill all threads
    for thread in pool:
        thread.join()

私はこの実装を使用していますが、私にとってはうまく機能します。そうしてほしい。

于 2013-04-22T10:11:33.763 に答える
12

スレッドが完了するのを待つために join() を呼び出していた場合は、単純に結果を Thread インスタンス自体にアタッチし、join() が返された後にメイン スレッドから取得することができます。

一方、スレッドが完了し、結果が利用可能であることをどのように発見するつもりなのかは教えてくれません。すでにそれを行う方法をお持ちの場合は、結果を出すための最良の方法をあなた (そして私たちに教えてくれれば私たち) に教えてくれるでしょう。

于 2009-12-12T01:27:10.220 に答える
12

ラムダを使用してターゲット スレッド関数をラップし、その戻り値をqueueを使用して親スレッドに戻します。(元のターゲット関数は、追加のキュー パラメーターなしで変更されません。)

サンプルコード:

import threading
import queue
def dosomething(param):
    return param * 2
que = queue.Queue()
thr = threading.Thread(target = lambda q, arg : q.put(dosomething(arg)), args = (que, 2))
thr.start()
thr.join()
while not que.empty():
    print(que.get())

出力:

4
于 2014-02-23T00:34:44.673 に答える
8

I'm surprised nobody mentioned that you could just pass it a mutable:

>>> thread_return={'success': False}
>>> from threading import Thread
>>> def task(thread_return):
...  thread_return['success'] = True
... 
>>> Thread(target=task, args=(thread_return,)).start()
>>> thread_return
{'success': True}

perhaps this has major issues of which I'm unaware.

于 2015-12-07T11:51:49.403 に答える
3

同期キューモジュールを使用できます。
既知の ID を持つデータベースからユーザー情報を確認する必要があるとします。

def check_infos(user_id, queue):
    result = send_data(user_id)
    queue.put(result)

これで、次のようにデータを取得できます。

import queue, threading
queued_request = queue.Queue()
check_infos_thread = threading.Thread(target=check_infos, args=(user_id, queued_request))
check_infos_thread.start()
final_result = queued_request.get()
于 2015-08-15T08:10:36.823 に答える
2

概念実証:

import random
import threading

class myThread( threading.Thread ):
    def __init__( self, arr ):
        threading.Thread.__init__( self )
        self.arr = arr
        self.ret = None

    def run( self ):
        self.myJob( self.arr )

    def join( self ):
        threading.Thread.join( self )
        return self.ret

    def myJob( self, arr ):
        self.ret = sorted( self.arr )
        return

#Call the main method if run from the command line.
if __name__ == '__main__':
    N = 100

    arr = [ random.randint( 0, 100 ) for x in range( N ) ]
    th = myThread( arr )
    th.start( )
    sortedArr = th.join( )

    print "arr2: ", sortedArr
于 2015-01-26T21:08:29.663 に答える
1

さて、Python スレッド モジュールには、ロックに関連付けられた条件オブジェクトがあります。1 つのメソッドacquire()は、基になるメソッドから返される値を返します。詳細: Python 条件オブジェクト

于 2009-12-11T06:10:05.033 に答える
0

次のラッパー関数は、既存の関数をラップし、スレッドを指すオブジェクトを返します (そのため、スレッドstart()join()、 などを呼び出すことができます)。また、最終的な戻り値にアクセス/表示することもできます。

def threadwrap(func,args,kwargs):
   class res(object): result=None
   def inner(*args,**kwargs): 
     res.result=func(*args,**kwargs)
   import threading
   t = threading.Thread(target=inner,args=args,kwargs=kwargs)
   res.thread=t
   return res

def myFun(v,debug=False):
  import time
  if debug: print "Debug mode ON"
  time.sleep(5)
  return v*2

x=threadwrap(myFun,[11],{"debug":True})
x.thread.start()
x.thread.join()
print x.result

見た目はOKですし、threading.Threadこの種の機能を備えたクラスは簡単に拡張(*)されているように見えるので、なぜまだ存在しないのか疑問に思っています。上記の方法に欠陥はありますか?

(*)この質問に対するフサヌの回答はまさにこれを行い、サブクラス化すると戻り値を返すthreading.Threadバージョンになることに注意してください。join()

于 2016-03-22T14:04:04.890 に答える