python多執行緒處理資料並獲得子執行緒返回值

2021-09-27 09:47:20 字數 3925 閱讀 7989

獲取子執行緒返回值

python中採用多執行緒方式處理大資料量的資料是比較常見和便捷的方法,而有時還想獲取每個子執行緒執行得到的結果,因此將多執行緒處理和獲取子執行緒返回值的方法做一總結。

兩種方式:用方法包裝函式、用類包裝函式。

_thread.start_new_thread (func, args[

, kwargs]

)

其中,func是執行緒函式,args是傳遞給執行緒函式的引數且型別必須是tuple,kwargs是可選引數。

注意:

在python2中,多執行緒函式模組為thread,但是在python3中該模組已被_thread繼承,並重新定義了新的多執行緒模組threading

_thread模組提供了低階別的、原始的執行緒以及乙個簡單的鎖,它相比於threading模組的功能比較有限。

以下是乙個通過_thread模組實現多執行緒的簡單示例:

import _thread

import time

defprint_time

(thread_name, delay)

: c =

0while c <5:

time.sleep(delay)

c +=

1 res =

"%s: %s"

%(thread_name, time.ctime(time.time())

)print

(res)

# return res # 作為執行緒執行時函式中的return是無意義的

if __name__ ==

"__main__"

:# 用方法包裝執行緒

try:

try:

_thread.start_new_thread(print_time,

("thread-1",1

,)) _thread.start_new_thread(print_time,

("thread-2",2

,))except

:pass

# 謹慎使用此操作:極其耗費cpu

while1:

time.sleep(

0.1)

except keyboardinterrupt:

print

("you stop the threading."

)

注意:

該方法因為需要while 1迴圈執行才能跑完多個執行緒,且無法自動退出,只能手動退出;

由於while 1操作極耗記憶體,因此需加入sleep機制緩解此情況;

考慮到threading模組構建類進行多執行緒操作更友好,因此實際應用中不採用此方法。

首先通過threading模組構建多執行緒類mythread.py

import threading

import time

# mythread.py執行緒類

class

mythread

(threading.thread)

:def

__init__

(self, func, args=()

):super

(mythread, self)

.__init__(

) self.func = func

self.args = args

defrun(self)

: time.sleep(1)

self.func(

*self.args)

其中,func是執行緒函式,arg是傳遞給執行緒函式的引數且型別是tuple。

獲取子執行緒結果的方法不少,包括:

從類中返回值;

設定全域性佇列寫入返回值;

通過multiprocessing.pool.threadpool獲取返回值;

通過concurrent.futures,結合set_result和result方法獲取返回值等。

從類中返回值是非常常見簡便的方法,該方法的多執行緒類可以將上文中的mythread.py檔案稍作修改:

import threading

import time

# mythread.py執行緒類

class

mythread

(threading.thread)

:def

__init__

(self, func, args=()

):super

(mythread, self)

.__init__(

) self.func = func

self.args = args

self.result =

defrun

(self)

: time.sleep(1)

self.result = self.func(

*self.args)

defget_result

(self)

:try

:return self.result

except exception:

return

none

在該方法的基礎上,就可以實現返回子執行緒結果的功能了。

以下通過乙個簡單示例來說明:

from mythread import mythread

defadd

(a, b)

: c = a + b

return c

if __name__ ==

"__main__"

:# 用類包裝執行緒

ls =[23

,89] thr =

# 建立4個執行緒

for i in

range(4

):task = mythread(add,

(ls[0]

, ls[1]

))task.start(

) task.join())

)print

(thr)

這裡寫了乙個簡單的加法函式add,通過呼叫多執行緒類mythread來實現獲取子執行緒結果的功能。

這裡需要注意兩點:

一定要join子執行緒再get_result獲取子執行緒結果,否則只會返回最後乙個執行的子執行緒的結果。這是因為加入join阻塞後主執行緒必須等待所有子執行緒執行結束才會結束,那麼每個子執行緒的結果都會通過task.get_result()獲得。

一定不能join加入mythreadget_result中,這樣雖然同樣會獲取子執行緒結果,但是多執行緒執行會失效。這一操作實質上是將多個執行緒順序執行,因為在子執行緒中加入join阻塞後必須等待此子執行緒執行完才會執行下乙個子執行緒,因此這一操作相當於將程式又變成單執行緒執行。

其他方法暫時還沒有研究和實操,等之後試過再寫吧。

python多執行緒處理資料

python多執行緒處理資料 從檔案讀取資料,多執行緒處理 usr bin env python encoding utf 8 import threading import time from queue import queue def readfile file object open opt...

多執行緒處理mysql資料

閒來無事研究了下py,發現多執行緒處理起資料來比php不要爽太多,廢話少說上碼 author yao import mydb from time import ctime,sleep def mythread db for i in xrange 10 sql select from y user ...

C 多執行緒處理資料

os centos 7 編譯環境 gcc 4.8 cpu 2顆 intel r xeon r cpu e5 2670 v3 2.30ghz,24核48執行緒。int pthread create pthread t thread,const pthread attr t restrict attr,...