Python-读取每x数量的行

时间:2018-10-30 15:11:11

标签: python multithreading

我想要的是让5个线程逐行读取文件的内容。 第一个线程必须读取该行,我希望线程从不同点开始每隔5行读取一次。

(Index Pos)
t1 reads >>> 0, 5, 10, 15
t2 reads >>> 1, 6, 11, 16

以此类推。

当前,我尝试使用模数来执行此操作,但是存在一些质数(例如15)引起问题的问题。这不是我的最后一篇文章,但是这是我正在显示的内容,因为我使用的内容太糟糕了,没有任何意义。

def function(n):#Function to generate hash
  count = n
  for line in open('wordlist.txt'):#For each line in a file do this
    if count % 2 == 0:
      linex = line.strip()
      hashed = hashlib.md5(linex.encode()).hexdigest()
      #print(line + ":" + hashed)
      count += 1
    else:
      count += 1

长话短说,我需要一些帮助,我将非常感谢帮助我解决此问题的人。

只需要在文本文件的行上进行迭代即可。

1 个答案:

答案 0 :(得分:0)

这是我所建议的一个例子。这个过程stdin, 向五名工人汇款。第一位工人将 得到0、5、10、15等行,第二个工作人员将得到1、6、11、16 等,等等。

import itertools
import queue
import sys
import threading


class Worker(threading.Thread):
    def __init__(self, id, q, **kwargs):
        self.id = id
        self.q = q
        super().__init__(daemon=True, **kwargs)

    def run(self):
        while True:
            # Receive another (line_number, line) tuple from the
            # main thread.
            ln, line = self.q.get()
            if ln == -1:
                break

            print('thread {} processing line {}: {}'.format(self.id, ln, line))


def main():
    workers = []
    queues = []

    # create workers, and for each worker create a queue that will
    # be used to pass data to the worker.
    for i in range(5):
        q = queue.Queue()
        w = Worker(i, q)
        workers.append(w)
        queues.append(q)
        w.start()

    # create a "cycle": an infinite iterator that will loop over
    # the list of queues.
    q_cycle = itertools.cycle(queues)
    for ln, line in enumerate(sys.stdin):
        q = next(q_cycle)
        q.put((ln, line))

    # tell the workers to exit
    for q in queues:
        q.put((-1, None))

    # wait for workers to finish
    for w in workers:
        w.join()


if __name__ == '__main__':
    main()