gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:21:37 26 4
gpt4 key购买 nike

import threading
import csv

csv_content = []

def load_csv(f_csv):
global csv_content
heading = next(f_csv)
print("heading: {0}".format(heading))
for lin in f_csv:
print(lin)
csv_content.append(lin)

def main():
with open('test.csv', 'rt') as f:
f_csv = csv.reader(f)
threadA = threading.Thread(target=load_csv, args=(f_csv,))
threadA.start()

global csv_content
curr_idx = 0
while curr_idx < len(csv_content):
print("[{0}]: {1}".format(curr_idx, csv_content[curr_idx]))
curr_idx += 1

if __name__ == "__main__":
main()
File "thread_csv.py", line 8, in load_csv
heading = next(f_csv)
StopIteration

我刚刚发现,如果我将 csv 处理程序传递给上面的 python 线程函数,代码将失败。相反,如果我传递文件名,它将起作用。

问题> 为什么我们无法将 csv 文件处理程序传递给线程函数,有人可以告诉我一些信息吗?

谢谢

====更新工作代码===

  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()

调用 .start() 后会发生什么?你退出经理。管理器关闭文件,处理程序现在指向一个关闭的文件。因此 StopIteration。这有点像竞争条件。

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

with open('test.csv', 'rt') as f:
...
threadA.start()
threadA.join()

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

关于python-3.x - 为什么我不能将 csv 处理程序传递给 python 线程函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45288305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com