版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/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这,文字分析无用,这里我引用别的代码来讲解:
扫描二维码关注公众号,回复:
3835408 查看本文章
import csv
from multiprocessing import Pool #导入进程池
import datetime
def mycallback(x):
print(x)
csv_write.writerow(x)
def sayHi(num):
w = [str(num), str(num+1), str(num+2)]
return w
if __name__ == '__main__':
e1 = datetime.datetime.now()
csv_file = open('Text.csv', 'w')
csv_write = csv.writer(csv_file)
p = Pool(4)
for i in range(10):
p.apply_async(sayHi, (i,),callback=mycallback)#sayHi是我们进程运行的对象,callback=mycallback这里是当
sayHi运行完后的回调函数这里需要注意,calback是单参数就是不能有2个参数以上,且sayHi(即多进程的运行的函数)
必须有return 的返回值且是单个值不能有多个.
p.close()
p.join()
e2 = datetime.datetime.now()
print((e2-e1))
csv_file.close()