gpt4 book ai didi

python - python中的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 16:59:35 25 4
gpt4 key购买 nike

标签可能不准确,因为我不确定问题出在哪里。

我有一个模块,我试图从套接字读取一些数据,并将结果写入文件(追加)它看起来像这样,(仅包含相关部分)

if __name__ == "__main__":
<some init code>
for line in file:
t = Thread(target=foo, args=(line,))
t.start()
while nThreads > 0:
time.sleep(1)

这是其他模块,
def foo(text):
global countLock, nThreads
countLock.acquire()
nThreads += 1
countLock.release()

"""connect to socket, send data, read response"""
writeResults(text, result)

countLock.acquire()
nThreads -= 1
countLock.release()

def writeResults(text, result):
"""acquire file lock"""
"""append to file"""
"""release file lock"""

现在问题来了。最初,我在函数 'foo' 中有一个错字,我将变量 'line' 传递给 writeResults 而不是 'text'。 'line' 没有在函数 foo 中定义,它是在主块中定义的,所以我应该看到一个错误,但它工作正常,只是数据被多次附加到文件中,而不是被写入一次,这是我在修复错字时得到的必需行为。

我的问题是,

1) 为什么我没有收到错误消息?

2) 为什么多次调用 writeResults 函数?

最佳答案

当你有(简化到重要的部分)

def foo(text):
writeResults(line, result)
foo , 没有局部变量 line , 正在使用该名称的全局变量...恰好是 for line in file: 设置的一个(在主线程中) .

具体来说,我希望写入的总行数没问题:每行有一个线程(一种奇怪的架构,顺便说一句),每个线程写一行……唯一的问题是, 其中每个线程写入的行。

按照你的意图,第一个线程写第一行,第二个线程写第二行,依此类推;但实际上每个线程都会写入恰好绑定(bind)到全局 line 的行关键时刻线程调用 writeResults的名字.因此,有些行很可能会被多次写入,而有些则不会被写入。

例如,假设主线程运行得足够快,足以在它们中的任何一个实际开始写入之前启动所有子线程。在这种情况下,全局名称 line 采用的最后一个值(即文件中的最后一行)将是所有线程写入的行。

请注意,即使在“更正”版本中,也无法保证各行的写入顺序,这是使这种架构变得奇怪的部分原因——通常,由于行以特定顺序出现,您会想要保留输出顺序。我猜您的应用程序案例足够奇特,不需要该约束,但是当您从一个文件读取并写入一个文件时,您需要这么多线程,我仍然感到困惑!-)

关于python - python中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575847/

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