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
(
)
```