使用python每秒更新文件contept的多任务

2024-06-16 11:33:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个聊天逻辑,所以这里我想做的

def chatlogic():
    talk=True
    while talk:
        if __name__ == '__main__':
            Thread(target = fluse).start()
        message = raw_input('enter a message: ')
        if not message: #Ending Conversation if empty message was sent
            talk=False          
        conv_file.write('[%s]%s: %s\n' %(msgtime,user,message))
        #conv_file.flush()
        return 'Conversation Ended'

def fluse():
    while True:
        time.sleep(1)
        conv_file.fluse()

文件必须每秒钟更新一次,无论您在做什么。 我做错什么了? 注意:我以前从未使用过多任务处理


Tags: nametruemessageifmaindef逻辑thread
1条回答
网友
1楼 · 发布于 2024-06-16 11:33:40

这段代码中有许多问题,但您似乎要问的问题如下:

while talk:
    if __name__ == '__main__':
        Thread(target = fluse).start()

这意味着每次通过循环,即每条消息一次,您将触发一个新的fluse线程。线程将永远循环,每秒调用conv_file.fluse(),直到时间结束。你知道吗

因此,如果你在应用程序启动后的0.3秒、2.7秒和5.1秒输入消息,你将在5.3秒得到一个fluse,在5.7秒得到另一个,在6.1秒得到另一个,依此类推。你知道吗

如果希望这种情况只发生一次/秒,只需启动一个线程,而不是每次通过循环启动一个新线程。例如:

if __name__ == '__main__':
    Thread(target = fluse).start()
while talk:
    # etc.

相反,如果希望它发生在每个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)

这仍然是一个奇怪的设计。即使你没有写任何东西,文件也会被刷新一次/秒,而且不能保证它会在最后被刷新,以此类推。但听起来你就是想这么做的。你知道吗

相关问题 更多 >