Декоратор воркера и мультипроцессинг на python
upd. Всем привет. Данный декоратор должен выполнять некую функцию, пока выполняется декодируемая функция. Однако, есть проблемный случай.Проблема возникает со значения int_range >= 13150 в декодируемой функции. Если результат меньше, либо снять декоратор, то все отрабатывает корректно
import time
from multiprocessing import Process, Queue
class Decorator:
def __init__(self, pinger_func, pinger_step: int):
self.pinger_func = pinger_func
self.pinger_step = pinger_step
def __call__(self, func):
q = Queue()
def wrapper(*args, **kwargs):
def subprocess():
q.put(func(*args, **kwargs))
p = Process(target=subprocess)
p.start()
while p.is_alive():
self.pinger_func(self.pinger_step)
else:
p.close()
return q.get()
return wrapper
def sender(n):
time.sleep(n)
print("i'm pinger")
@Decorator(sender, 1)
def test(int_range):
time.sleep(5)
print('pre done')
rst = [(i,) for i in range(int_range)] ### эмуляция данных
print('done')
return rst
print(test(15000))
Тестирую на python 3.10.5. При int_range 15000 работает некорректно:

При 13149, либо снятом декораторе, все - ок.

Ответы (1 шт):
Автор решения: Chorkov
→ Ссылка
Например, с использованием отдельной очереди сообщений:
class Decorator:
def __init__(self, pinger_func, pinger_step: int):
self.pinger_func = pinger_func
self.pinger_step = pinger_step
def __call__(self, func):
q = Queue()
def wrapper(*args, **kwargs):
def subprocess():
q.put(func(*args, **kwargs))
p = Process(target=subprocess)
p.start()
while p.is_alive():
self.pinger_func(self.pinger_step)
else:
p.close()
return q.get()
return wrapper