- "Исполнительная часть": оно получает задачу и затем выполняет ее. Исполнитель запускает каждую задачу в отдельном процессе из-за работы ввода-вывода (2 соединения сокета). Одновременно может выполняться только одна задача (поскольку они используют общие ресурсы).
- "Часть колбы": она предоставляет пользователям контроль над исполнителем, фиксирует задачи, считывает состояние исполнителя. и т. д.
TaskExecutor.py
Код: Выделить всё
def execute(task, reporter):
conn = ResourceConnection(...)
with conn as c:
for f in task:
func, args = f
func(c, **args)
reporter.report(...) # updates state of execution
class TaskExecutor:
def __init__(self):
self._process = Process()
self.reporter = Reporter() # some variables
def _is_alive(self): # checks if the process is alive
...
def _graceful_term(self): # stops the process
...
def start(self, task):
if self._is_alive():
self._graceful_term()
self._process = Process(target=executor,
args=(task, self.reporter))
self._process.start()
def stop(self):
...
Код: Выделить всё
control_bp = Blueprint('control', __name__, url_prefix='/control')
task_executor = TaskExecutor()
@control_bp.route('/demo', methods=["POST"])
def run_demo():
task_executor.start([demo_func, {"a": 42}])
return ""
@control_bp.route('/state')
def get_state():
return task_executor.reporter.to_json()
Я начал смотреть на Gunicorn, и мне кажется неясным, если бы только один Задача в моей «исполнительной части» будет выполняться одновременно и будет ли вообще работать. Gunicorn, похоже, порождает дочерние процессы (работники), которые будут иметь общую память, которая используется только для чтения, а не для записи или выполнения. Я ошибаюсь, или мне нужно как-то доработать мост? Как Gunicorn создает рабочие процессы с общими объектами?
Если это важно, в моем приложении одновременно будет только 1–2 пользователя.
Подробнее здесь: https://stackoverflow.com/questions/631 ... k-gunicorn