多线程读写文件的问题

2016-01-31 12:38:38 +08:00
 just1
用 python 写一个多线程的爬虫,要进行本地文件读写(同一文件),有蛮大几率出现文件正在被操作的冲突,加锁应该可以,但是效率就不行了,求实现保证效率的方案
5561 次点击
所在节点    程序员
19 条回复
just1
2016-01-31 12:57:17 +08:00
20 分钟惨案。。
just1
2016-01-31 13:22:07 +08:00
40 分钟惨案。。。
vigoss
2016-01-31 13:28:20 +08:00
写内存再延迟写硬盘,话说你的爬虫多高速度呀,加锁都接受不了么,另外 py 原生多线程可是很慢的。
tinyproxy
2016-01-31 20:56:02 +08:00
加个 io 线程和 io 任务队列,话说你写爬虫的,为什么不用数据库。。。。
just1
2016-01-31 20:57:50 +08:00
@tinyproxy 懒得看。。。写 txt 方便
just1
2016-01-31 20:59:27 +08:00
@tinyproxy 虽然请求多但符合要求的实际写入量不大,
mengzhuo
2016-01-31 22:58:18 +08:00
所有文件分别写到临时文件里,最后再合并
zjq426
2016-01-31 23:07:41 +08:00
单说写的,

看这个日志干嘛用,要是没有特别实时的要求,每个进程自己写自己的日志,事后汇总整理。也可以边写边汇总整理。

要是一条都不能错,还非得多进程用同一个文件,上 flock 。

或者不走网络的话可以用一个代理队列程序写日志,把要写的内容发给代理。

走网络的话写日志会慢,还是每个实例自己写自己的日志好。
pynix
2016-02-01 03:58:11 +08:00
MapReduce
ryd994
2016-02-01 09:09:04 +08:00
@just1 写 txt 方便,那你现在解决多线程方不方便啊?
为什么吊死在一棵树上?
hrong
2016-02-01 09:49:45 +08:00
日志服务
paw
2016-02-01 09:54:55 +08:00
import logging
.....
sdrzlyz
2016-02-01 10:32:38 +08:00
加锁拖低效率。。。你实测过降低了多少还是想当然?( ps ,当然会降,但对于爬虫来讲,不会说降到不可接受的地步吧)
hqs123
2016-02-01 11:06:01 +08:00
不懂,收藏学习。
VYSE
2016-02-01 15:00:17 +08:00
http://stackoverflow.com/questions/1154446/is-file-append-atomic-in-unix
不用 fsync 坑仍然存在

logging 下 socket , http handler 都能更好解决问题
louk78
2016-02-01 15:10:24 +08:00
将文件切割为 a-f 文件,开 A-F 线程写,最后化零为整
song0071000
2016-02-01 17:53:02 +08:00
@zjq426 同意
petelin
2017-08-11 16:19:05 +08:00
正好遇到类似的问题, 我发现写日志的时候, 多进程并没有出现问题, 原来写小于 PIPE_BUF 是原子的.

http://me.xrange.top/2017/mutiprocess_append_1_file.html
lostsummer
2018-11-02 16:24:39 +08:00
挖个坟
不知道大家发现没,python3 支持 posix 系统调用 os.pread()/os.pwrite(),以这样的方式打开文件
f = os.open('test', os.O_APPEND|os.O_RDWR)
用 pread/pwrite 读写是可以保证原子性的。

PIPE_BUF 是 POSIX 管道确保读写原子性的最大值, 我不知道和磁盘文件有什么关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/254580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX