獲取子執行緒返回值
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
加入mythread的get_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,...