Как правильно управлять потоками? - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно запустить 3 или 5 потоков, эти потоки следят за некоторыми действиями в ОС.Из-за этого основная программа должна работать в фоновом режиме.Я прочитал много примеров и объяснений, но мне пока не ясно, как запускать потоки и основную программу в фоновом режиме, а после этого - как ими управлять.

Я запускаю потоки в режиме демона из основной программы:

import threading
import time

def fun1():
    while True:
        print("Thread 1")
        time.sleep(1)

def fun2():
    while True:
        print("Thread 2")
        time.sleep(1)

def fun3():
    while True:
        print("Thread 3")
        time.sleep(1)

def main():
    thread1 = threading.Thread(target=fun1)
    thread1.daemon = True
    thread1.start()

    thread2 = threading.Thread(target=fun2)
    thread2.daemon = True
    thread2.start()

    thread3 = threading.Thread(target=fun3)
    thread3.daemon = True
    thread3.start()

if __name__ == '__main__':
    try:
        main()
        while True:
            print("------------")
            print("Main program")
            print("------------")
            time.sleep(3)
    except (KeyboardInterrupt, SystemExit):
        print("Terminated")

и после этого я запускаю программу main в фоновом режиме с (я не уверен, что это лучший способ сделать то, чего я хочу достичь):

python daemon_thread.py &

Как управлять потоками после инициализации основной программы, если мне нужно остановить определенный поток, изменить его состояние или что-то еще?Как получить доступ к определенной теме или основной программе?

1 Ответ

0 голосов
/ 11 октября 2018

Теперь я понимаю, как это сделать, чтобы возобновить проблему: у меня есть основная программа, работающая в фоновом режиме, и у этой основной программы есть несколько потоков.Но я хочу с помощью другого скрипта или программы остановить основную программу с потоками более безопасно, а в некоторых случаях приостановить и возобновить потоки.

У меня не было правильного представления о том, как использовать потоки.Я могу остановить или отправить сигнал этим потокам из основной программы How ?, с базой данных или файлом конфигурации.

Я обновил свой проект с такими изменениями:

import threading
import time
import sqlite3

def fun1(stop_event1):
    while not stop_event1.is_set(): 
        print("Thread 1")
        time.sleep(1)

def fun2(stop_event2):
    while not stop_event2.is_set(): 
        print("Thread 2")
        time.sleep(1)

def fun3(stop_event3):
    while not stop_event3.is_set(): 
        print("Thread 3")
        time.sleep(1)

def main():
    stop_event1 = threading.Event()
    thread1 = threading.Thread(target=fun1, args=(stop_event1,))
    thread1.daemon = True
    thread1.start()

    stop_event2 = threading.Event()
    thread2 = threading.Thread(target=fun2, args=(stop_event2,))
    thread2.daemon = True
    thread2.start()

    stop_event3 = threading.Event()
    thread3 = threading.Thread(target=fun3, args=(stop_event3,))
    thread3.daemon = True
    thread3.start()

    while True:
        print("------------")
        print("Main program")
        print("------------")
        time.sleep(3)            
        if alive_main():
            print("Finish Threads")
            stop_event1.set()
            stop_event2.set()
            stop_event3.set()

            print("Bye")
            break


def alive_main():
    conn = sqlite3.connect('example.db')
    c = conn.cursor()
    c.execute('SELECT alive_main FROM config')
    row = c.fetchone()
    if row[0] == 1:
        return True
    else:
        return False

if __name__ == '__main__':
    try:
        main()
    except (KeyboardInterrupt, SystemExit):
        print("Terminated")

Если я хочу изменить с помощьюдругой класс или сценарий - состояние моих потоков, я просто изменяю конфигурационную таблицу в моей базе данных, и это вступает в силу в Потоках из основной функции.В этом примере, если я правильно остановлю свои потоки и программу, просто обновлю таблицу, вот и все.

sqlite> UPDATE config SET alive_main = 1;

Мне нужно прочитать о Signals и Условных объектах , чтобы дополнитьправильно темы использует.

Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...