Создать новый поток журнала или использовать поток демона? - PullRequest
0 голосов
/ 06 октября 2018

Я новичок в многопоточности, теперь я хочу использовать поток для записи в файл журнала каждые 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 голосов
/ 06 октября 2018

Есть два вопроса.

Первый использует поток демона или нет.Это зависит от вашего спроса.Если вы можете смириться с тем, что поток внезапно завершается, что означает, что нет необходимости в очистке, тогда вы можете использовать поток демона, как это будет удобно.

Второй способ - передать сообщение.Я думаю, это классическая проблема очереди сообщений.Лучшая структура должна использовать очередь.

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