python изменение глобальной переменной статическим методом класса

Есть класс для запуска задачи по расписанию. Запускаю его отдельным процессом. Пытаюсь отследить изменение глобальной переменной, но она не меняется. Сообщения, выдаваемые классом меняются, а в glob_check() - всегда первоначальное значение. Как в glob_check получить LAST_CHECK измененное в def check_news() ????

import schedule
import time
import datetime
from multiprocessing.context import Process
LAST_CHECK = 'class'

class P_schedule:  # Class для работы с schedule

global LAST_CHECK

@staticmethod
def start_schedule():  # Запуск schedule
    global LAST_CHECK
    ######Параметры для schedule######
    schedule.every(1).minutes.do(P_schedule.check_news)
    ##################################

    while True:  # Запуск цикла
        schedule.run_pending()
        time.sleep(1)

@staticmethod
def check_news():
    global LAST_CHECK
    print("previos LAST_CHECK = " + LAST_CHECK)
    time.sleep(2)
    LAST_CHECK = 'Последняя проверка по расписанию ' + str(datetime.datetime.now())
    print("check_news by schedule LAST_CHECK = " + LAST_CHECK)
    # return LAST_CHECK

def glob_check():
    print("info LAST_CHECK = " + LAST_CHECK)

def start_process():#Запуск Process
    p1 = Process(target=P_schedule.start_schedule, args=()).start()

if __name__ == '__main__':
    start_process()
    while True:
        a = input("input 1 for exit")
        if a == "1":
            break
        glob_check()

Пытаюсь использовать multiprocessing.Manager,

import schedule

import time
import datetime
from ctypes import c_char_p
from multiprocessing.context import Process
from multiprocessing import Value, Manager

class P_schedule:  # Class для работы с schedule
    @staticmethod
    def start_schedule(LAST_CHECK):  # Запуск schedule
        print("schedule start")
        ######Параметры для schedule######
        schedule.every(1).minutes.do(P_schedule.check_news(LAST_CHECK))
        ##################################

    while True:  # Запуск цикла
        schedule.run_pending()
        time.sleep(1)

@staticmethod
def check_news(LAST_CHECK):
    print("previos LAST_CHECK = " + LAST_CHECK.value)
    time.sleep(2)
    LAST_CHECK.value = 'Последняя проверка по расписанию ' + str(datetime.datetime.now())
    print("check_news by schedule LAST_CHECK = " + LAST_CHECK.value)


def glob_check(LAST_CHECK):
    print("info LAST_CHECK = " + str(LAST_CHECK.value))

def start_process():#Запуск Process
    p1 = Process(target=P_schedule.start_schedule, args=(LAST_CHECK,)).start()

if __name__ == '__main__':
    manager = Manager()
    LAST_CHECK = manager.Value(c_char_p, "init")
    start_process()

    while True:
        a = input("input 1 for exit")
        if a == "1":
            break
        glob_check(LAST_CHECK)` 

значение передается, но задача по расписанию отрабатывает 1 раз и вылетает ошибка

Process Process-2:
Traceback (most recent call last):
  File "C:\Anastasiia\Python38-32\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "C:\Anastasiia\Python38-32\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Anastasiia\pyproject\db_roszdrav\for_help.py", line 19, in start_schedule
    schedule.every(1).minutes.do(P_schedule.check_news(LAST_CHECK))
  File "C:\Anastasiia\pyproject\venv\lib\site-packages\schedule\__init__.py", line 440, in do
    self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable

Ответы (1 шт):

Автор решения: zenana

Итак, для для обмена значением LAST_CHECK между процессами задействован multiprocessing.Manager. А ошибка TypeError:the first argument must be callable. вылетала из-за того в schedule.every(1).minutes.do(P_schedule.check_news(LAST_CHECK)) P_schedule.check_news нельзя вызывать, нужно передавать как функцию, т.о. задействована partial(P_schedule.check_news, LAST_CHECK)

import schedule
import time
import datetime
from ctypes import c_char_p
from multiprocessing.context import Process
from multiprocessing import Value, Manager
from functools import partial

class P_schedule:  # Class для работы с schedule
    @staticmethod
    def start_schedule(LAST_CHECK):  # Запуск schedule
        print("schedule start")
        ######Параметры для schedule######
        schedule.every(1).minutes.do(partial(P_schedule.check_news, LAST_CHECK))  # без partial здесь вылетала ошибка
        ##################################
    while True:  # Запуск цикла
        schedule.run_pending()
        time.sleep(1)

@staticmethod
def check_news(LAST_CHECK):
    print("previos LAST_CHECK = " + LAST_CHECK.value)
    time.sleep(2)
    LAST_CHECK.value = 'Последняя проверка по расписанию ' + str(datetime.datetime.now())
    print("check_news by schedule LAST_CHECK = " + LAST_CHECK.value)


def glob_check(LAST_CHECK):
    print("info LAST_CHECK = " + str(LAST_CHECK.value))

def start_process():#Запуск Process
    p1 = Process(target=P_schedule.start_schedule, args=(LAST_CHECK,)).start()

if __name__ == '__main__':
    manager = Manager()
    LAST_CHECK = manager.Value(c_char_p, "init") # задействовали Manager из  multiprocessing
    start_process()

    while True:
        a = input("input 1 for exit")
        if a == "1":
            break
        glob_check(LAST_CHECK)

Вот теперь все работает!!!

→ Ссылка