threadpool
- makeRequests的原型如下 def makeRequests(callable_, args_list, callback=None, exc_callback=_handle_thread_exception),可以看出第一個(gè)參數(shù)是線程將要啟動(dòng)任務(wù)函數(shù),第二個(gè)是要傳個(gè)任務(wù)函數(shù)的參數(shù)列表,第三個(gè)是回調(diào)函數(shù),可以用于收集任務(wù)結(jié)束后的結(jié)果或者環(huán)境清理
- args_list 中每一項(xiàng)要么是一個(gè)單獨(dú)的變量,要么是一個(gè)2個(gè)元素的元組,該元組第1項(xiàng)是位置參數(shù)的列表,該元組的第2項(xiàng)是關(guān)鍵參數(shù)的字典(很繞口,但最重要
- 任務(wù)函數(shù)的多參數(shù),你可以統(tǒng)統(tǒng)通過位置參數(shù)列表傳進(jìn)去,也可以統(tǒng)統(tǒng)通過關(guān)鍵字參數(shù)字典傳進(jìn)去,也可以通過混合方式傳進(jìn)去
- 例如你的任務(wù)函數(shù)有兩個(gè)參數(shù),一個(gè)是name,一個(gè)是age,那么你可以傳args_list為[([‘python’, 12], None), ]這樣的形式, None是未傳遞的關(guān)鍵字參數(shù)字典。
- 也可以傳args_list為[(None, {‘name’:‘python’, ‘a(chǎn)ge’: 12}), ]這樣的形式,None是未傳遞的位置參數(shù)列表。
- 還可以傳args_list為[([‘python’], {‘a(chǎn)ge’: 12}), ]這樣的形式,這就是混合形式
- 個(gè)人感覺太靈活了,而且不好理解
以下是簡單的4行代碼:
pool
=
threadpool
.
ThreadPool
(
10
)
#建立線程池,控制線程數(shù)量為10
reqs
=
threadpool
.
makeRequests
(
get_title
,
data
,
print_result
)
#構(gòu)建請求,
#get_title為要運(yùn)行的函數(shù),data為要多線程執(zhí)行函數(shù)的參數(shù),
#最后這個(gè)print_result是可選的,是對前兩個(gè)函數(shù)運(yùn)行結(jié)果的操作
[
pool
.
putRequest
(
req
)
for
req
in
reqs
]
#多線程一塊執(zhí)行
pool
.
wait
(
)
#線程掛起,直到結(jié)束
創(chuàng)建線程池,線程數(shù)為10:
pool
=
threadpool
.
ThreadPool
(
10
)
創(chuàng)建線程請求,包涵調(diào)用的函數(shù)、參數(shù)和回調(diào)函數(shù):
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個(gè)元素的元組,第一個(gè)是list,第二個(gè)是dict,如果線程函數(shù)需要多個(gè)參數(shù),需要拼接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
)
]
將所有要運(yùn)行多線程的請求扔進(jìn)線程池:
[
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
)
回調(diào)函數(shù)
結(jié)果收集用callback參數(shù)
callback必須接受2個(gè)匿名參數(shù), 按順序分別是WorkRequest對象和任務(wù)函數(shù)的結(jié)果。
舉個(gè)栗子
def
save_callback
(
request
,
result
)
:
# 第1個(gè)參數(shù)是request,可以訪問request.requestID
# 第2個(gè)參數(shù)是request執(zhí)行完的結(jié)果
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'}), ...]的參數(shù)列表
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
(
)
```
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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