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 шт):
Итак, для для обмена значением 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)
Вот теперь все работает!!!