前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理
1 现场案例:
我有一个[ip1,ip2,ip3,.......]这样的列表,我要每个元素ip传递给一个get_ping_info(addr)函数得到返回延迟信息,然后将结果到一保存个result列表中,如果用一个单进程执行的话可能需要几分钟,但是如果多进程处理就可以缩减几倍的速度了
用法:(程序代码只截图了部分,不可运行)
1
|
pool.apply_async(函数名, (函数的参数
1
,函数的参数
2
,函数的参数
3
))
|
1
|
import
multiprocessing
|
1
2
3
4
5
6
7
8
|
def
get_ping_info(create_time,prov,city,net_type,addr):
result
=
ping.quiet_ping(addr, timeout
=
2
, count
=
5
, psize
=
64
)
loss_rate
=
result[
0
]
max_time
=
float
(
'%.3f'
%
result[
1
])
if
isinstance
(result[
1
],
float
)
else
0
#if max_time and average_time is None use 0
average_time
=
float
(
'%.3f'
%
result[
1
])
if
isinstance
(result[
2
],
float
)
else
0
print
create_time,prov,city,net_type,loss_rate, average_time
return
(create_time,prov,city,net_type,loss_rate, average_time)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
if
__name__
=
=
"__main__"
:
all_city_result_tmp
=
[]
all_city_result
=
[]
create_time
=
datetime.now()
city_list
=
get_city_list()
pool
=
multiprocessing.Pool(processes
=
4
)
for
prov,city,addr
in
city_list:
all_city_result_tmp.append(pool.apply_async(get_ping_info, (create_time,prov,city,
'CTC'
,addr )))
pool.close()
pool.join()
for
city_info
in
all_city_result_tmp:
#print city_info.get()
all_city_result.append(city_info.get())
|
注意:
1 all_city_result_tmp 只是多线程多线的列表,其中列表中的元素.get() 函数才会去执行元素对象,对象中有执行get_ping_info函数的信息和返回值
本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1764707如需转载请自行联系原作者
cuizhiliang