2014-02-11 81 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