转自:https://blog.youkuaiyun.com/Kompany4/article/details/78107619
最近学习了Python的多进程,想到我的高德API爬虫那个爬取读写速度我就心累,实在是慢,看到多进程可以充分利用CPU核数我就开始完善我的代码,不过过程是艰辛的,在此之中出现了很多问题,其中最大的问题是爬取的数据是正确的,但是读写到Excel中却打开是空,想了半天也没解决,脑子笨没办法,不过我回想到多进程中不同进程是相互独立,即在多个进程下把数据写入同一文件由于是并发进行操作系统中会不清楚到底要写入哪个数据到文件中,所以会出现资源竞争混乱,导致文件内容出现空。
具体思路跟把文件输出集中在一起也差不多,就是把进程需要写入文件的内容作为返回值返回给惠和的回调函数,使用回调函数向文件中写入内容。
apply_async(func[, args[, kwds[, callback[, error_callback]]]])
apply()方法的一个变体,它返回一个结果对象。
如果指定callback,那么它应该是一个可接受单个参数的可调用对象。当结果完成时就对它应用callback,在调用失败的情况下则应用error_callback。
如果指定error_callback,那么它应该是一个接受单个参数的可调用对象。如果目标函数失败,则以该异常实例调用error_callback。
回调应该立即完成,否则处理结果的线程将被阻塞。
这是apply_async的用法中文文档,其中我们的回调函数的定义就是callback这,文字分析无用:
#coding: utf-8
from multiprocessing import Pool
import time
import random
def mycallback(x):
print str(x)
with open('muti_process_log.txt', 'a+') as f:
f.writelines('%d, \n' % x)
def sayHi(num):
time.sleep(random.random()) #random.random()随机生成0-1之间的小数
return num
if __name__ == '__main__':
start = time.time()
pool = Pool(100)
for i in range(100):
pool.apply_async(sayHi, (i,), callback=mycallback)
pool.close()
pool.join()
stop = time.time()
print 'delay: %.3fs' % (stop - start)