2014-02-11 166 views
0

我创建了5个线程来处理这些行。我发送一行作为每个线程的参数。迭代文件但每次迭代需要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存有悲坐阿梅德,...' 的东西。

该错误不在多线程类中,也没有调用,它出现在文件的迭代中,但是,为什么?

对于那些谁是问为什么我需要这样的:脚本必须处理线加载在Web表单数据,并采取了很多的时间(滞后于服务器)。我意识到,如果我分工的任务更快。 (我不知道是否有更好的方法来做到这一点)

+0

这是有点不清楚你想要做什么。您的文件中可以有多少行?你想要多少个线程?这听起来像你想要5个线程,但它看起来像你正在为文件中的每一行创建一个线程。 – Weeble

+0

@Weeble文件中的行是未知的。有5个线程。是的,我为文件中的每一行创建一个线程,但同时只有5个线程正在工作。 – Trimax

+1

为什么不能有5个线程并通过队列发送线路?顺便说一下,在Python中,严格来说,即使在多核机器上,只有一个线程可以同时工作*。 – bereal

回答

2

试试这个:

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

您似乎每行创建一个线程? – bereal

+0

是的,每一行都有它自己的线程。 –

+0

谢谢@JayanthKoushik修复文件迭代的错误。 – Trimax

-1

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

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

拉出这样的:

myLine = myFile.__next__() 

做最后的循环:

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

的确实%整数除法总是确保它适用于螺纹指数!

+0

将发送相同的行到每个线程。 – M4rtini

+0

好点我会编辑 –

+0

h%6是错的。有5个线程,编号为1到5. –

1

myLine = myFile.__next__(),您提前myFile迭代器。当迭代器被完全消耗时,它会将该异常作为信号抛出。

你可以捕捉到,并简单地打破循环,因为你知道你已经完成了。

不幸的是,在你的程序中的逻辑错误,太:你每一个线程开始后推进迭代器,而且在外环。这意味着在你开始所有的线程之后,下一行将被读入myLine,它被外层循环立即覆盖。

为了避免(并有较少的代码),你可以用一些替换整个内循环和外循环像

[MyThread(i%5+1, myLine).start() for i, myLine in enumerate(myFile)] 
+0

这将创建一个很长的任何'开始'返回列表,'无'可能。如果您实际上不需要该列表,则无需使用列表解析。 – M4rtini

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

这是否做你想要什么?

+0

对不起@ M4rtini,但我不明白那个代码。我不知道itertools模块。 – Trimax