我创建了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表单中加载数据,并花费大量时间(在服务器中滞后)。我意识到,如果我将任务划分得更快。 (我不知道是否有更好的方法可以做到这一点)
答案 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
%执行整数除法以始终确保它适合线程索引!