Python 3.x 为什么我不能将csv处理程序传递给python线程函数?

Python 3.x 为什么我不能将csv处理程序传递给python线程函数?,python-3.x,Python 3.x,我刚刚发现,如果像上面那样将csv处理程序传递给python线程函数,代码将失败。相反,如果我传递文件名,它就会工作 问题>有人能告诉我为什么我们不能将csv文件处理程序传递给线程函数吗 多谢各位 ==更新工作代码=== File "thread_csv.py", line 8, in load_csv heading = next(f_csv) StopIteration 1导入线程 2导入csv 3. 4 csv_内容=[] 5. 6 def load_csv(文件名): 7打开(

我刚刚发现,如果像上面那样将csv处理程序传递给python线程函数,代码将失败。相反,如果我传递文件名,它就会工作

问题>有人能告诉我为什么我们不能将csv文件处理程序传递给线程函数吗

多谢各位

==更新工作代码===

File "thread_csv.py", line 8, in load_csv
    heading = next(f_csv)
StopIteration
1导入线程
2导入csv
3.
4 csv_内容=[]
5.
6 def load_csv(文件名):
7打开(文件名为“rt”)作为f:
8 f_csv=csv.reader(f)
9全球csv_内容
10标题=下一个(f_csv)
11打印(“标题:{0}”。格式(标题))
12对于f_csv中的lin:
13印刷品(林)
14 csv_内容追加(lin)
15
16 def main():
17 threadA=threading.Thread(target=load_csv,args=('test.csv',))
18.a.start()
19
20全球csv_内容
21 curr_idx=0
22而当前idx
找到了答案。此代码是罪魁祸首:

  1 import threading
  2 import csv
  3
  4 csv_content = []
  5
  6 def load_csv(file_name):
  7     with open(file_name, 'rt') as f:
  8         f_csv = csv.reader(f)
  9         global csv_content
 10         heading = next(f_csv)
 11         print("heading: {0}".format(heading))
 12         for lin in f_csv:
 13             print(lin)
 14             csv_content.append(lin)
 15
 16 def main():
 17     threadA = threading.Thread(target=load_csv, args=('test.csv',))
 18     threadA.start()
 19
 20     global csv_content
 21     curr_idx = 0
 22     while curr_idx < len(csv_content):
 23         print("[{0}]: {1}".format(curr_idx, csv_content[curr_idx]))
 24         curr_idx += 1
 25
 26 if __name__ == "__main__":
 27     main()
调用
.start()
后会发生什么?你离开经理。管理器关闭文件,处理程序现在指向一个关闭的文件。因此,
停止迭代
。这在某种程度上是一种竞赛条件

要解决此问题,您需要在上下文管理器中等待线程完成,因此调用
threadA.join()


或者,不要使用上下文管理器-使用
f=open(…)
打开文件,然后正常启动线程。

传递文件时的代码是什么?@cᴏʟᴅsᴘᴇᴇᴅ 请看我的更新帖子。谢谢这解释了为什么它有时有效,而其他时间不起作用。我将更改代码,以便线程函数将打开处理程序本身。非常感谢您为我们节省时间debug@q0987这肯定是另一种选择。很高兴我能帮忙。:)
  1 import threading
  2 import csv
  3
  4 csv_content = []
  5
  6 def load_csv(file_name):
  7     with open(file_name, 'rt') as f:
  8         f_csv = csv.reader(f)
  9         global csv_content
 10         heading = next(f_csv)
 11         print("heading: {0}".format(heading))
 12         for lin in f_csv:
 13             print(lin)
 14             csv_content.append(lin)
 15
 16 def main():
 17     threadA = threading.Thread(target=load_csv, args=('test.csv',))
 18     threadA.start()
 19
 20     global csv_content
 21     curr_idx = 0
 22     while curr_idx < len(csv_content):
 23         print("[{0}]: {1}".format(curr_idx, csv_content[curr_idx]))
 24         curr_idx += 1
 25
 26 if __name__ == "__main__":
 27     main()
with open('test.csv', 'rt') as f:
    f_csv = csv.reader(f)
    threadA = threading.Thread(target=load_csv, args=(f_csv,))
    threadA.start()
with open('test.csv', 'rt') as f:
    ...
    threadA.start()
    threadA.join()