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

时间:2018-10-06 17:45:31

标签: 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:
      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并不是最好的(通过全局变量)。

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

非常感谢!

1 个答案:

答案 0 :(得分: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)