用 python 写一个多线程的爬虫,要进行本地文件读写(同一文件),有蛮大几率出现文件正在被操作的冲突,加锁应该可以,但是效率就不行了,求实现保证效率的方案
1
just1 OP 20 分钟惨案。。
|
2
just1 OP 40 分钟惨案。。。
|
3
leveraging Jan 31, 2016 via Android 写内存再延迟写硬盘,话说你的爬虫多高速度呀,加锁都接受不了么,另外 py 原生多线程可是很慢的。
|
4
tinyproxy Jan 31, 2016 via iPad 加个 io 线程和 io 任务队列,话说你写爬虫的,为什么不用数据库。。。。
|
7
mengzhuo Jan 31, 2016 所有文件分别写到临时文件里,最后再合并
|
8
zjq426 Jan 31, 2016 单说写的,
看这个日志干嘛用,要是没有特别实时的要求,每个进程自己写自己的日志,事后汇总整理。也可以边写边汇总整理。 要是一条都不能错,还非得多进程用同一个文件,上 flock 。 或者不走网络的话可以用一个代理队列程序写日志,把要写的内容发给代理。 走网络的话写日志会慢,还是每个实例自己写自己的日志好。 |
9
pynix Feb 1, 2016 MapReduce
|
11
hrong Feb 1, 2016 via Android 日志服务
|
12
paw Feb 1, 2016 import logging
..... |
13
sdrzlyz Feb 1, 2016
加锁拖低效率。。。你实测过降低了多少还是想当然?( ps ,当然会降,但对于爬虫来讲,不会说降到不可接受的地步吧)
|
14
hqs123 Feb 1, 2016
不懂,收藏学习。
|
15
VYSE Feb 1, 2016
http://stackoverflow.com/questions/1154446/is-file-append-atomic-in-unix
不用 fsync 坑仍然存在 logging 下 socket , http handler 都能更好解决问题 |
16
louk78 Feb 1, 2016
将文件切割为 a-f 文件,开 A-F 线程写,最后化零为整
|
17
song0071000 Feb 1, 2016
@zjq426 同意
|
18
petelin Aug 11, 2017 正好遇到类似的问题, 我发现写日志的时候, 多进程并没有出现问题, 原来写小于 PIPE_BUF 是原子的.
http://me.xrange.top/2017/mutiprocess_append_1_file.html |
19
lostsummer Nov 2, 2018
挖个坟
不知道大家发现没,python3 支持 posix 系统调用 os.pread()/os.pwrite(),以这样的方式打开文件 f = os.open('test', os.O_APPEND|os.O_RDWR) 用 pread/pwrite 读写是可以保证原子性的。 PIPE_BUF 是 POSIX 管道确保读写原子性的最大值, 我不知道和磁盘文件有什么关系。 |