迭代一个文件,但每次迭代需要5行

时间:2014-02-11 16:25:15

标签: python multithreading file python-3.x

我创建了5个线程来处理这些行。我将每行作为参数发送一行。

输出就是我需要的。但后来却出错了。

代码:

#!usr/bin/env python3
# -*- coding: UTF-8 -*-

import threading

# Create class myThread as subclass of Thread
class MyThread(threading.Thread):
    def __init__(self, num, myArg):
        threading.Thread.__init__(self)
        self.num = num
        self.myArg = myArg

# Overrides run() method to defines the thread goes to do.
    def run(self):
        print ("I'm thread number: ", self.num)
        print(self.myArg)


myFile = open('file_01.txt', mode='r')

for myLine in myFile:
    for h in range(1, 6):    # create 5 instances of the thread
        t = MyThread(h, myLine)
        t.start()
        myLine = myFile.__next__()

myFile.close()

错误:

Traceback (most recent call last):
  File "/sajime/PycharmProjects/Learning/iterarFichero.py", line 25, in <module>
    myLine = myFile.__next__()
StopIteration

'file_01.txt'内容是一个简单的'Lorem ipsum dolor sit amet,......'。

错误不在multi-threadinig类中,也不在调用中,它来自文件的迭代,但是,为什么?

对于那些问我为什么需要这个的人:脚本必须处理行以在Web表单中加载数据,并花费大量时间(在服务器中滞后)。我意识到,如果我将任务划分得更快。 (我不知道是否有更好的方法可以做到这一点)

4 个答案:

答案 0 :(得分:2)

试试这个:

for count, myLine in enumerate(myFile):
    t = MyThread(count % 5 + 1, myLine)
    t.start()

答案 1 :(得分:1)

使用myLine = myFile.__next__(),您可以推进myFile迭代器。当迭代器被完全消耗时,它会将StopIteration异常作为信号抛出。

你可以抓住它,简单地打破循环,因为你知道你已经完成了。

不幸的是,你的程序中也存在一个逻辑错误:你在每个线程启动后推进迭代器,但也在外部循环中。这意味着在你启动所有线程之后,下一行将被读入myLine,它会立即被外部循环覆盖。

为了避免这种情况(并且代码更少),您可以用

之类的内容替换整个内部和外部循环。
[MyThread(i%5+1, myLine).start() for i, myLine in enumerate(myFile)]

答案 2 :(得分:0)

from itertools import cycle, izip
for h, myLine in izip(cycle(range(1,6)), myFile):
    t = MyThread(h, myLine)
    t.start()

这样做你想要的吗?

答案 3 :(得分:-1)

这是因为你在每个循环中两次调用'next'行。

代码中的for循环通过每次调用next遍历行。然后你在循环中再次调用它。

拉出来:

myLine = myFile.__next__()

制作最终循环:

h=0
for myLine in myFile:
    t = MyThread((h % 6), myLine)
    t.start()
    h+=1

%执行整数除法以始终确保它适合线程索引!