Python中獲取執行緒返回值的常用方法!

老男孩IT教育機構發表於2023-05-10

  Python中獲取執行緒返回值的方式主要有三種:使用全域性變數的列表,來儲存返回值;重寫Thread的join方法,返回執行緒函式的返回值;使用標準庫concurrent.futures,接下來具體為大家介紹一下這三種方式。

  1、使用全域性變數的列表,來儲存返回值

  ret_valuese = []

  def thread_func(*args):

  ...

  value = ...

  ret_values.append(value)

  選擇列表的一個原因是:列表的append()方法是執行緒安全的,CPython中,GIL防止對它們的併發訪問。如果你使用自定義的資料結構,在併發修改資料的地方需要加執行緒鎖。

  如果事先知道有多少個執行緒,可以定義一個固定長度的列表,然後根據索引來存放返回值,比如:

  from = threading import Thread

  threads = [Nome] * 10

  results = [Nome] * 10

  def foo(bar,result,index):

  result[index] = f"foo-{index}"

  for i in range(len(threads)):

  threads[i] = Thread(target=foo, args=('world!',results,i))

  threads[i].start()

  for i in range(len(threads)):

  threads[i].join()

  print("".join(results))

  2、重寫Thread的join方法,返回執行緒函式的返回值

  預設的thread.join()方法只是等待執行緒函式結束,沒有返回值,我們可以在此處返回函式的執行結果,程式碼如下:

  from threading import Thread

  def foo(arg):

  return arg

  class ThreadWithReturnValue(Thread):

  def run(self):

  if self._target is not None:

  self._return = self._target(*self._args,**self._kwargs)

  def join(self):

  super().join()

  retirm self._return

  twrv = ThreadWithReturnValue(target=foo,args=("hello world",))

  twrv.start()

  print(twrv.join())#此處會列印hello world。

  這樣當我們呼叫thread.join()等待執行緒結束的時候,也就得到了執行緒的返回值。

  3、使用標準庫concurrent.futures

  相對於前面兩種方法,Python的標準庫concurrent.futures提供更高*的執行緒操作,可以直接獲取執行緒的返回值,相當優雅,程式碼如下:

  import concurrent.futures

  def foo(bar):

  return bar

  with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:

  to_do = []

  for i in range(10):#模擬多個任務

  future = executor.submit(foo,f"hello world! {i}")

  to_do.append(future)

  for future in concurrent.futures.as_completed(to_do):# 併發執行

  print(future.result())


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952527/viewspace-2951193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章