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

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

Я создаю небольшое приложение, и я в основном разделил его на 3 части:

  • 1-ая часть - это когда пользователь вводит некоторые данные в программу через input ()

  • 2-ая часть - это функция, которая принимает некоторые данные, которыепользователь вошел, отправил его через запрос POST и собрал ответ сервера. (давайте назовем это «функцией A»)

  • 3-я часть, которая также является самой большой, является основной функцией, которая берет некоторые данные из пользовательского ввода, а также ответ сервера отфункция A, и использует его для отправки нескольких запросов POST. (давайте назовем это «функцией B»)

Еще одна важная деталь: функция A должна запускаться каждые 30 минут внутри бесконечного цикла, обеспечивая функцию B свежими данными с сервера. И, если появляется ошибка на стороне сервера, функция B должна иметь возможность «принудительно перезапустить / обновить» функцию A, чтобы получить обновленную информацию до автоматического перезапуска 30-минутного цикла.

Я прикрепилчрезвычайно упрощенная версия моей программы для более легкого понимания:

user_input = input()

def function_A():
    global server_response
    while True:
        server_request_A = requests.post(url=user_input)
        server_response = str(server_request_A.headers[12:34])
        time.sleep(1800)

def function_B():
    global server_response
    while True:
        server_request_B = requests.post(
            url=function_b_url, headers=server_response)
        if server_requests_B.status_code == 200:
            break
        elif server_requests_B.status_code == 403:
            # Insert a way to restart function/thread A and get correct server_response
            pass

# Here we create and launch threads based on functions A and B.

Мои основные проблемы:

  • Как убедиться, что два потока / функции могут взаимодействоватьдруг с другом / отправить данные из функции A в функцию B? Я создал глобальную переменную, которая используется в обеих функциях, но будет ли этого достаточно для многопоточности? Я знаю, что для многопроцессорной обработки вам нужно вручную назначить переменные, которые будут использоваться обоими процессами / функциями, одинаково ли для многопоточности?

  • Возможно ли принудительное перезапуск одного потокадругой поток, когда определенный "флаг" поднят? Предположим, что функция B сталкивается с сообщением об ошибке, когда пытается использовать данные, предоставленные ей функцией A. Я хочу, чтобы он принудительно перезапускал / обновлял поток, использующий функцию A, но я слышал, что это невозможно и является плохой практикой. Какие у меня будут варианты?

  • И, последний вопрос: как мне правильно создавать потоки и назначать им функции? Я пытался искать учебники в Интернете, но они были либо слишком просты для моего конкретного случая, либо слишком технически, чтобы я мог их понять и использовать.

Я действительно ценю всю помощь, ребята!

PS Я задал подобный вопрос здесь около недели назад, и люди рекомендовали мне использовать планировщик Windows. Я просто хотел уточнить, что это не то, что я ищу, и я специально хочу использовать многопоточные или многопроцессорные модули для своей программы.

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