这段代码有很多问题,但您似乎要问的是这里:
while talk:
if __name__ == '__main__':
Thread(target = fluse).start()
这意味着每次通过循环——即每条消息一次——你将触发一个新fluse
线程。并且该线程永远循环,每秒调用conv_file.fluse()
一次,直到时间结束。
因此,如果您在应用程序启动后的 0.3、2.7 和 5.1 秒键入消息,您将fluse
在 5.3 秒、5.7 秒和 6.1 秒收到另一个消息,依此类推。
如果您希望这种情况每秒只发生一次,只需启动一个线程,而不是每次通过循环都启动一个新线程。例如:
if __name__ == '__main__':
Thread(target = fluse).start()
while talk:
# etc.
相反,如果您希望它在 each 之后发生一秒write
,但不是在那之后的每一秒,只需将循环从函数中取出:
def fluse():
time.sleep(1)
conv_file.fluse()
虽然在这种情况下,threading.Timer
是一种更简单的方法来做同样的事情。
无论如何,正如我所说,即使有了这个修复,还有许多其他问题:
- 您正在调用一个不存在的文件方法 - 大概您的意思是
flush
而不是fluse
?
- 该文件也不存在。也许你的意思是它是一个全局的,在函数之外创建的?还是对他们的争论?
- 你试图永远循环直到一个空的消息,但你
return
每次都通过循环调用,这意味着你只会循环一次。
- 没有办法退出你的程序,因为你触发了一个永远运行的非守护进程后台线程。
- 无论如何,您永远不会调用该
chatlogic
函数,因此程序会立即退出而不做任何工作。
如果我修复了你程序中的所有其他错误,并添加了一些东西来告诉我fluse
线程是否在做它的工作,它会做一些事情……也许你可以告诉我们它是否是你想要的东西。
from threading import Thread
import time
def chatlogic(conv_file):
user = 'Nobody'
t = Thread(target=flusher, args=[conv_file])
t.daemon=True
t.start()
while True:
message = raw_input('enter a message: ')
if not message: #Ending Conversation if empty message was sent
break
msgtime = time.asctime()
conv_file.write('[%s]%s: %s\n' %(msgtime,user,message))
return 'Conversation Ended'
def flusher(conv_file):
while True:
time.sleep(1)
print 'Flushing the file now'
conv_file.flush()
if __name__ == '__main__':
conv_file = open('convfile.txt', 'w')
chatlogic(conv_file)
这仍然是一个奇怪的设计。即使你没有写任何东西,文件也会被刷新一次/秒,并且不能保证它实际上会在最后被刷新,依此类推。但这听起来像是你试图做的。