Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代一个文件,但每次迭代5行_Python_Multithreading_File_Python 3.x - Fatal编程技术网

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

Python 迭代一个文件,但每次迭代5行,python,multithreading,file,python-3.x,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): thre

我已经创建了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
回溯(最近一次呼叫最后一次):
文件“/sajime/PycharmProjects/Learning/iterarFichero.py”,第25行,在
myLine=myFile.\uuuuu next\uuuuuu()
停止迭代
“file_01.txt”内容是一个简单的“Lorem ipsum dolor sit amet,…”内容

这个bug不在multi-threadinig类或调用中,它出现在文件的迭代中,但是,为什么呢


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

这是因为您在每个循环中调用“下一行”两次

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

拿出这个:

myLine = myFile.__next__()
要进行最终循环,请执行以下操作:

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

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

使用myLine=myFile.\uuu下一步\uuuuu(),您将推进myFile迭代器。当迭代器被完全使用时,它抛出
StopIteration
异常作为信号

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

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

为了避免这种情况(并减少代码),您可以使用以下内容替换整个内部和外部循环

[MyThread(i%5+1, myLine).start() for i, myLine in enumerate(myFile)]
试试这个:

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

这是你想要的吗

你想做什么有点不清楚。文件中可以有多少行?你想要多少线?听起来您需要5个线程,但看起来您正在为文件中的每一行创建一个线程。@Weeble文件中的行是未知的。有5条线。是的,我为文件中的每一行创建了一个线程,但是只有5个线程同时工作。为什么不使用5个线程并通过队列发送行呢?顺便说一句,在Python中,严格来说,即使在多核机器上,也只有一个线程可以同时工作。你很好,@bereal。我用迭代器文件修复了bug,但现在它崩溃了,无法打开线程错误。我必须处理排队的问题。谢谢这将创建一个长列表,列出
start
返回的内容,
None
。如果您实际上不想要列表,则无需使用列表理解。感谢@JayanthKoushik修复了iteneration文件的错误。抱歉@M4rtini,但我不理解该代码。我不知道itertools模块。
from itertools import cycle, izip
for h, myLine in izip(cycle(range(1,6)), myFile):
    t = MyThread(h, myLine)
    t.start()