Python学习多进程并发写入同一文件

本文分享了利用Python多进程技术提高爬虫效率的经验。针对数据写入Excel时出现空白的问题,作者通过调整多进程中的数据处理方式,采用回调函数集中处理写入操作,有效解决了资源竞争问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: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) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值