threadpool
- makeRequests的原型如下 def makeRequests(callable_, args_list, callback=None, exc_callback=_handle_thread_exception),可以看出第一個參數是線程將要啟動任務函數,第二個是要傳個任務函數的參數列表,第三個是回調函數,可以用于收集任務結束后的結果或者環境清理
- args_list 中每一項要么是一個單獨的變量,要么是一個2個元素的元組,該元組第1項是位置參數的列表,該元組的第2項是關鍵參數的字典(很繞口,但最重要
- 任務函數的多參數,你可以統統通過位置參數列表傳進去,也可以統統通過關鍵字參數字典傳進去,也可以通過混合方式傳進去
- 例如你的任務函數有兩個參數,一個是name,一個是age,那么你可以傳args_list為[([‘python’, 12], None), ]這樣的形式, None是未傳遞的關鍵字參數字典。
- 也可以傳args_list為[(None, {‘name’:‘python’, ‘age’: 12}), ]這樣的形式,None是未傳遞的位置參數列表。
- 還可以傳args_list為[([‘python’], {‘age’: 12}), ]這樣的形式,這就是混合形式
- 個人感覺太靈活了,而且不好理解
以下是簡單的4行代碼:
pool
=
threadpool
.
ThreadPool
(
10
)
#建立線程池,控制線程數量為10
reqs
=
threadpool
.
makeRequests
(
get_title
,
data
,
print_result
)
#構建請求,
#get_title為要運行的函數,data為要多線程執行函數的參數,
#最后這個print_result是可選的,是對前兩個函數運行結果的操作
[
pool
.
putRequest
(
req
)
for
req
in
reqs
]
#多線程一塊執行
pool
.
wait
(
)
#線程掛起,直到結束
創建線程池,線程數為10:
pool
=
threadpool
.
ThreadPool
(
10
)
創建線程請求,包涵調用的函數、參數和回調函數:
requests
=
threadpool
.
makeRequests
(
func
,
args_list
,
call_back
)
# 源代碼
# `args_list`` should be either a 2-item tuple of the list of positional arguments and a dictionary of keyword arguments or a single, non-tuple argument.
args_list必須是包含2個元素的元組,第一個是list,第二個是dict,如果線程函數需要多個參數,需要拼接list或者dict。
# 方法1
lst_vars_1
=
[
'1'
,
'2'
,
'3'
]
lst_vars_2
=
[
'4'
,
'5'
,
'6'
]
func_var
=
[
(
lst_vars_1
,
None
)
,
(
lst_vars_2
,
None
)
]
# 方法2
dict_vars_1
=
{
'm'
:
'1'
,
'n'
:
'2'
,
'o'
:
'3'
}
dict_vars_2
=
{
'm'
:
'4'
,
'n'
:
'5'
,
'o'
:
'6'
}
func_var
=
[
(
None
,
dict_vars_1
)
,
(
None
,
dict_vars_2
)
]
將所有要運行多線程的請求扔進線程池:
[
pool
.
putRequest
(
req
)
for
req
in
requests
]
# 等同于
for
req
in
requests
:
pool
.
putRequest
(
req
)
等待所有的線程完成工作后退出:
pool
.
wait
(
)
示例:
#!/usr/bin/env python
# coding:utf-8
import
time
import
random
import
threadpool
HEHE
=
dict
(
)
def
sayhello
(
name
,
v
)
:
global
HEHE
if
HEHE
.
has_key
(
name
)
:
HEHE
[
name
]
=
HEHE
[
name
]
+
'+'
+
v
else
:
HEHE
[
name
]
=
v
#time.sleep(2)
#name_list = [(['caoshuai', '1'], None), (['yangliu', '2'], None),(['caoshuai', '3'], None),(['ss', '10'], None),(['wwwwww', '12'], None),]
name_list
=
[
(
[
'caoshuai'
,
'1'
]
,
None
)
,
(
[
'caoshuai'
,
'2'
]
,
None
)
,
(
[
'a'
,
'3'
]
,
None
)
,
(
[
'ss'
,
'10'
]
,
None
)
,
(
[
'wwwwww'
,
'12'
]
,
None
)
,
(
[
'm'
,
'12'
]
,
None
)
,
(
[
'n'
,
'12'
]
,
None
)
,
(
[
'b'
,
'12'
]
,
None
)
,
(
[
'v'
,
'12'
]
,
None
)
,
(
[
'x'
,
'12'
]
,
None
)
,
(
[
'z'
,
'12'
]
,
None
)
,
]
#name_list = [1, -5, 6, -4]
start_time
=
time
.
time
(
)
pool_t
=
threadpool
.
ThreadPool
(
4
)
requestss
=
threadpool
.
makeRequests
(
sayhello
,
name_list
)
[
pool_t
.
putRequest
(
req
)
for
req
in
requestss
]
pool_t
.
wait
(
)
print
HEHE
print
"%s second"
%
(
time
.
time
(
)
-
start_time
)
while
True
:
time
.
sleep
(
1
)
回調函數
結果收集用callback參數
callback必須接受2個匿名參數, 按順序分別是WorkRequest對象和任務函數的結果。
舉個栗子
def
save_callback
(
request
,
result
)
:
# 第1個參數是request,可以訪問request.requestID
# 第2個參數是request執行完的結果
print
(
request
.
requestID
,
result
)
with
open
(
'result.txt'
,
'a'
)
as
f
:
f
.
write
(
result
+
'\n'
)
def
get_user_info
(
uid
,
sex
,
name
,
age
)
:
time
.
sleep
(
0.3
)
return
"{0},{1},{2},{3}"
.
format
(
uid
,
sex
,
name
,
age
)
if
__name__
==
'__main__'
:
num
=
100
para_list
=
[
[
i
,
'male'
]
for
i
in
range
(
1
,
num
)
]
users
=
list
(
)
for
i
in
range
(
1
,
num
)
:
user
=
{
'name'
.
format
(
i
)
:
'user{0}'
.
format
(
i
)
,
'age'
:
i
}
users
.
append
(
user
)
params
=
zip
(
para_list
,
users
)
# print(params)
# 形如[([1, 'male'], {'age': 1, 'name': 'user1'}), ...]的參數列表
pool_size
=
10
pool
=
threadpool
.
ThreadPool
(
pool_size
)
requests
=
threadpool
.
makeRequests
(
get_user_info
,
params
,
save_callback
)
for
req
in
requests
:
pool
.
putRequest
(
req
)
pool
.
wait
(
)
```
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
