您的位置:首页 > 编程语言 > Python开发

python多线程读取同一个文件

2015-05-13 21:36 106 查看
python多线程读取同一个文件

多线程读取同一个文件,要求不能重复,不能遗漏。

最开始尝试了一种方法(后来实践证明是无效的)

主线程分配给每个读线程需要读取文件中哪些行,

比如线程1读取1-10行,线程2读取11-30行。

然后每个线程通过readline()来读取,读到的行如果不属于本线程的范围,则continue跳过。

实践证明,这若干个线程并没有按照我们期望来读。

我的猜想是,通过open来打开一个文件,多个线程返回的是同一个句柄,

或者一个文件的文件指针只有一个。

 

经过网上搜索和实践,总结出有以下方法支持多线程读取同一个文件。

1 通过队列Queue来实现。主线程启动一个线程来读文件,把文件的内容放到队列里。

然后启动若干线程,全部从队列取数据。python中的Queue是线程安全的。
http://stackoverflow.com/questions/18781354/is-iterating-over-a-python-file-object-thread-safe
Is iterating over a Python file object thread safe?

 

2 通过linecache来实现。linecache可以指定行号来读取一个文件的任意一行。主线程先分配给每个读线程各自读取的行号,然后各线程根据行号用linecache来读取。

此种方法依赖于linecache读取任意一行的速度,如果是大文件,则比较慢。

比如线程1需要读取10-20行。假设线程1有自己的文件指针的话,读了地10行,可以直接很快定位到第11行。但是用linecache读取的话,每一次读取一行就没有什么关系了。当然,对于linecache怎么定位到任意一行,其中的原理我也没探究过。

 

3分文件读取。python先调用linux命令head和tail,将一个文件分成若干个文件。然后每个读线程负责读取一个文件即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 多线程 读文件