多线程读取同一个文件,要求不能重复,不能遗漏。
最开始尝试了一种方法(后来实践证明是无效的)
主线程分配给每个读线程需要读取文件中哪些行,
比如线程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,将一个文件分成若干个文件。然后每个读线程负责读取一个文件即可。