2016-07-30 5 views
-2

Я искал по всему Google и не могу заставить это работать. Я пытаюсь направить 2 функции, обе из которых являются бесконечными циклами.Python thread is not threading

Глядя на выдержку ниже, он запускает только 1-й поток и не переходит к следующей строке.

PS: Когда я меняю 2 потока вокруг, то у меня такая же проблема со второй нитью.

def syslog_service(): 
    syslog_server = socketserver.UDPServer((syslog_host,syslog_port), Syslog_Server) 
    syslog_server.serve_forever() 

def cleanup_old_logs_service(): 
# lock = threading.Lock() 
# threading.Thread.__init__(self) 
    global syslog_retention_hours 
    global RUNNING 
    while RUNNING: 
#  cleanup_old_logs_service.lock.acquire() 
     cleanup.old_logs(syslog_retention_hours) 
#  cleanup_old_logs_service.lock.release() 
     time.sleep(10) 

if __name__ == "__main__": 
    try: 
     logger.info("Starting main thread") 
     config() 
     logger.info("Starting system testing") 
     test() 
     logger.info("Config loaded") 
     thread1 = cleanup_old_logs_service() 
     thread2 = syslog_service() 
     thread1.start() 
     logger.info("Syslog cleanup service running") 
     thread2.start() 
     logger.info("Syslog server running") 
+2

Calling переменной 'thread1' Безразлично» t автоматически делает его нитью. На самом деле вы не делаете никаких потоков. – user2357112

ответ

1

Причина, по которой выполняется только первый поток, состоит в том, что у вас на самом деле есть ТОЛЬКО один поток в вашей программе. Когда вы пишете thread1 = cleanup_old_logs_service() и thread2 = syslog_service(), вы не создаете новые потоки, а просто присваиваете возвращаемые значения своих функций двум различным переменным. По этой причине, как только программа встречает thread1, она выполняет cleanup_old_logs_service() и застревает в бесконечном цикле.

Чтобы создать новую тему, я хотел бы импортировать threading модуль, создать новый объект threadObj и запустить поток следующим образом:

import threading 

threadObj = threading.Thread(target=cleanup_old_logs_service) 
threadObj.start() 

Таким образом, функция cleanup_old_logs_service() будет выполнена в новом потоке.

+0

Вы избили меня на 10 секунд :) – ashwinjv

+0

Удивительный, спасибо, человек - он жив! – Spac3

0

Говоря thread1 = cleanup_old_logs_service(), вы фактически выполняете функцию cleanup_old_logs_service, не сохраняя ссылку на нить. Вы бы сказать

import threading # If you have not already 

thread1 = threading.Thread(target=cleanup_old_logs_service) 
thread2 = threading.Thread(target=syslog_service) 

# Now you can start the thread 
thread1.start() 
logger.info("Syslog cleanup service running") 
thread2.start() 
logger.info("Syslog server running") 

Вы можете посмотреть на https://docs.python.org/3.5/library/threading.html для документации и https://pymotw.com/2/threading/ для примеров, потому что я считаю, что вам нужно будет использовать locks для управления доступом к ресурсам