Python 创建新的日志线程还是使用守护进程线程?

Python 创建新的日志线程还是使用守护进程线程?,python,multithreading,logging,Python,Multithreading,Logging,我是一个新的多线程程序员,现在我想用一个线程每隔2秒写入一个日志文件,我有两个解决方案,但我不知道哪一个更好 第一: def logger(msg): if msg != None: logging.info(msg) def main(): last = time.time() while True: msg = get_msg_from_somewhere() current = time.time() if current - last

我是一个新的多线程程序员,现在我想用一个线程每隔2秒写入一个日志文件,我有两个解决方案,但我不知道哪一个更好

第一:

def logger(msg):
    if msg != None:
      logging.info(msg)

def main():
  last = time.time()
  while True:
    msg = get_msg_from_somewhere()
    current = time.time()
    if current - last > 2:
      t1 = threading.Thread(target=logger, args = (msg, ))
      t1.start()
      last = current
第二:

message = None
def logger():
    global msg
    while True:
      if msg != None:
        logging.info(msg)
        msg = None
      time.sleep(2)

def main():
  t1 = threading.Thread(target=logger)
  t1.setDaemon(True)
  t1.start()
  while True:
    update_msg_from_somewhere()
我的想法:

我更喜欢第二种解决方案,因为它不需要一直比较时间戳,也不需要创建无穷无尽的新线程(尽管它们在完成后会被销毁,对吗?),但我认为传递
msg
的方式不是最好的(通过全局变量)

您对如何在守护进程线程运行时将变量传递给它有什么想法吗?您喜欢哪种解决方案?为什么?


非常感谢

有两个问题

第一个是使用守护进程线程或不使用守护进程线程。这取决于你的要求。如果您可以接受线程突然终止,这意味着不需要清理,那么您可以使用守护进程线程,因为这会很方便

第二个问题是如何传递消息。在我看来,这是一个典型的消息队列问题。更好的结构应该是使用队列

from queue import Queue

def logger(q):
    for msg in iter(q.get, None):
        logging.info(msg)

def main():
    q = Queue()
    t1 = threading.Thread(target=logger, args=(q,))
    t1.setDaemon(True)
    t1.start()
    while True:
        q.put(get_msg_from_somewhere())
        time.sleep(2)

有两个问题

第一个是使用守护进程线程或不使用守护进程线程。这取决于你的要求。如果您可以接受线程突然终止,这意味着不需要清理,那么您可以使用守护进程线程,因为这会很方便

第二个问题是如何传递消息。在我看来,这是一个典型的消息队列问题。更好的结构应该是使用队列

from queue import Queue

def logger(q):
    for msg in iter(q.get, None):
        logging.info(msg)

def main():
    q = Queue()
    t1 = threading.Thread(target=logger, args=(q,))
    t1.setDaemon(True)
    t1.start()
    while True:
        q.put(get_msg_from_somewhere())
        time.sleep(2)

谢谢你的回答!“如果你能接受线程突然终止,这意味着不需要清理”是什么意思?你能解释一下吗?@Jiahao如果主线程终止,守护进程线程将终止。而即使主线程终止,非守护进程线程也将继续运行。所以,如果主线程突然终止(例如,按下Ctrl+C),您将没有时间清理守护进程线程。这将是危险的,因为它可能导致资源泄漏或状态不一致。但我认为在你的情况下,这并不重要。但如果我将日志写入文件,那么最好创建新线程,对吗?像使用open('test.log','w')作为log:log.write(msg)一样,在实践中,您应该只打开一次日志文件。或者最好使用
loggin
的文件处理程序,而不是手动将日志写入文件。如果我使用
loggin
的文件处理程序,您认为使用守护进程线程可以吗?谢谢您的回答!“如果你能接受线程突然终止,这意味着不需要清理”是什么意思?你能解释一下吗?@Jiahao如果主线程终止,守护进程线程将终止。而即使主线程终止,非守护进程线程也将继续运行。所以,如果主线程突然终止(例如,按下Ctrl+C),您将没有时间清理守护进程线程。这将是危险的,因为它可能导致资源泄漏或状态不一致。但我认为在你的情况下,这并不重要。但如果我将日志写入文件,那么最好创建新线程,对吗?像使用open('test.log','w')作为log:log.write(msg)一样,在实践中,您应该只打开一次日志文件。或者最好使用
loggin
的文件处理程序,而不是手动将日志写入文件。如果我使用
loggin
的文件处理程序,您认为可以使用守护进程线程吗?