2016-07-30 6 views
-2

私はグーグル上を探してきましたが、これはうまくいかないようです。 私は2つの関数をスレッドしようとしていますが、どちらも無限ループです。Pythonスレッドがスレッディングではありません

以下の抽出を見ると、1番目のスレッドだけが開始され、次の1番目のスレッドに進むことはありません。

PS:2つのスレッドを交換すると、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

を持っているでしょう自動的にそれをスレッドにします。あなたは実際にここにスレッドを作っていません。 – user2357112

答えて

1

最初のスレッドだけが実行される理由は、実際にはプログラム内に1つのスレッドしかありません。 thread1 = cleanup_old_logs_service()thread2 = syslog_service()と書くと、新しいスレッドを作成するのではなく、関数の戻り値を2つの異なる変数に割り当てるだけです。このため、プログラムで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スレッドへの参照を保存しません。私はあなたがあなたのリソースへのアクセスを管理するためにlocksを使用する必要があると考えているので、あなたはthread1`は「doesnの `変数を呼び出す

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://pymotw.com/2/threading/ためhttps://docs.python.org/3.5/library/threading.htmlを見ることができますと言って

関連する問題