Python多线程写文件的2种方案

时间:17-05-10 栏目:编程开发 作者:kyle 评论:0 点击: 3,255 次

最近帮同事写一个批量查询数据的脚本。

从一个几十万行的文件内,读取第一行,查每一行是否收录。

单线程下面,效率非常低。

检查发现主要在请求网络时非常 慢。采用多线程之后,写文件到日志 里面成了最大的问题。

 

搜索了一下发现python并没有比较合适的并发写文件的示例。

 

参考了一些资料 ,总结出如下2种写法:

 

1、使用python的logging库。

自定义配置。需要做2步设置

首先使用cloghandler.ConcurrentRotatingFileHandler做为文件写出工具。需要sudo pip install ConcurrentLogHandler先安装再使用。。

然后把日志输出的格式改为format=%(message)s

除了信息不要任何东西。

 

然后并发时,使用

logging.config.fileConfig('logging.conf')
logger = logging.getLogger(__name__)

线程内使用:

logger.info(line.strip() + "," + htmlResult)

即可并发输出,效率有明显提升。

 

2、使用resultqueue = Queue.Queue()

多线程里面,取出每行URL,不停的请求页面,获取结果,把结果往resultqueue里面不停的写内容。

 

另开一个子线程读取resultqueue里面的内容,单线程循环写到文件内。单线程写文件速度还是非常快,避免了多线程同时操作文件的问题。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 把queue队列里面的内容循环取出来写到文件,单个线程去操作
class WriteFileThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):

        output = codecs.open('result.txt', 'w')

        emptyCount = 0
        while True:

            if emptyCount > 20:
                print '连续20次没有数据可获取,自动结束队列了'
                break

            # 如果队列为空,标记为空
            if (self.queue.empty()):
                emptyCount += 1  # 为空次数加1
                print "队列为空,第%s次休息,2秒再检查" % emptyCount
                time.sleep(2)  # 休息2秒

            else:
                emptyCount = 0  # 只要队列不是空的,就重置这个等待次数,以防断断续续导致提前退出
                result = self.queue.get()

                print '从队列获取到结果:' + result
                output.write(result + "\r\n")  # 从队列里面读取出来的结果直接写到文件里面

                # self.queue.task_done()

        self.queue.task_done()
        print "结束任务,写入文件关闭 At 【%s】" % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        output.close()

刚用python,代码粗漏。

3、把queue换成redis,更好用。

 

成都SEO小五嚎2句: 本文是(成都SEO小五)辛苦弄出来的,转载成都SEO小五原创的请保留链接: Python多线程写文件的2种方案,3Q

Python多线程写文件的2种方案:等您坐沙发呢!

来给哥评论评论


------====== 小五公告 ======------
成都SEO小五,专注成都搜索引擎优化。
小五善长站内外优化,C#、PHP开发,中英文SEO,Google中英文和百度优化技术。欢迎群内交流。伸手党请绕路,求资源的请绕开,求问题解答的请进群内交流。开放了一个QQ交流群:160750032。加入验证时请标注任何SEO相交字眼。友情链接直接Q我,收录正常,内容大部份原创、SEO或者程序开发、网络营销、线上推广等相关行业即可。

常用工具

赞助广告

来看过哥的人