0

我正在尝试编写聊天逻辑,所以这里是我想要做的

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

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

4

1 回答 1

2

这段代码有很多问题,但您似乎要问的是这里:

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)

这仍然是一个奇怪的设计。即使你没有写任何东西,文件也会被刷新一次/秒,并且不能保证它实际上会在最后被刷新,依此类推。但这听起来像是你试图做的。

于 2013-09-18T18:43:04.547 回答