Декоратор воркера и мультипроцессинг на 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 работает некорректно: problem

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


Ответы (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
→ Ссылка