【问题标题】:Multitask to update the file contept every second with python使用python每秒更新文件概念的多任务
【发布时间】:2013-09-23 15:44:21
【问题描述】:

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

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

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

【问题讨论】:

  • 首先,conv_file是什么,它的fluse方法应该做什么?
  • 第二,为什么在函数中间有if __name__ == '__main__'检查?你曾经调用过这个函数吗?
  • conv_file 是应该存储消息的对话文件,我使用了fluse来查看其他用户向他发送的消息
  • @abarnert 我刚刚在inernet中搜索了如何使用多任务并找到了这个例子
  • 我看不出有多少人可以在这里交谈。只有一个线程在运行raw_input 和文件writes。即使有多个线程,它们都会调用raw_input 并因此监听同一个本地用户。如果您打算通过全部写入某个 SMB 或 NFS 共享文件来让多人聊天,那么您没有任何代码可以读取该文件。

标签: python file reload multitasking


【解决方案1】:

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

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)

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

【讨论】:

  • 脚本在进入函数'chatlogic'后立即结束
  • @Streak:“脚本结束”是指它打印出异常回溯,告诉您文件没有属性fluse?正如我在顶部解释的那样,除了您询问的问题之外,您的代码还存在各种其他问题。我写了一个实际运行的版本,所以你可以告诉我们它是否是你想要的。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 2022-10-20
  • 2020-02-05
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多