From 1c0db871e401f75880e8de3356721aec878544da Mon Sep 17 00:00:00 2001 From: Sanskar Jethi Date: Wed, 3 Aug 2022 23:26:11 +0100 Subject: [PATCH] Fix multiprocessing in windows --- robyn/__init__.py | 21 +++++++++++---------- robyn/__init__.pyi | 16 ++++++++-------- robyn/processpool.py | 37 ++++++++++++++++++++++--------------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/robyn/__init__.py b/robyn/__init__.py index 2238c5a50..28244b9e0 100644 --- a/robyn/__init__.py +++ b/robyn/__init__.py @@ -6,17 +6,15 @@ from multiprocess import Process from watchdog.observers import Observer from robyn.events import Events -from .argument_parser import ArgumentParser -from .dev_event_handler import EventHandler -from .log_colors import Colors -from .processpool import spawn_process -from .responses import jsonify, static_file +from robyn.argument_parser import ArgumentParser +from robyn.dev_event_handler import EventHandler +from robyn.log_colors import Colors +from robyn.processpool import spawn_process +from robyn.responses import jsonify, static_file -from .robyn import SocketHeld -from .router import MiddlewareRouter, Router, WebSocketRouter -from .ws import WS - -mp.allow_connection_pickling() +from robyn.robyn import SocketHeld +from robyn.router import MiddlewareRouter, Router, WebSocketRouter +from robyn.ws import WS logger = logging.getLogger(__name__) @@ -104,11 +102,13 @@ def start(self, url="127.0.0.1", port=5000): :param port int: reperesents the port number at which the server is listening """ + mp.allow_connection_pickling() if not self.dev: processes = [] workers = self.workers socket = SocketHeld(url, port) + for _ in range(self.processes): copied_socket = socket.try_clone() p = Process( @@ -136,6 +136,7 @@ def start(self, url="127.0.0.1", port=5000): logger.info(f"{Colors.BOLD}{Colors.OKGREEN} Terminating server!! {Colors.ENDC}") for process in processes: process.kill() + else: event_handler = EventHandler(self.file_path) event_handler.start_server_first_time() diff --git a/robyn/__init__.pyi b/robyn/__init__.pyi index 3c8f50fc4..cb1762404 100644 --- a/robyn/__init__.pyi +++ b/robyn/__init__.pyi @@ -9,14 +9,14 @@ from watchdog.observers import Observer from robyn.events import Events -from .argument_parser import ArgumentParser -from .dev_event_handler import EventHandler -from .log_colors import Colors -from .processpool import spawn_process -from .responses import jsonify, static_file -from .robyn import Server, SocketHeld -from .router import MiddlewareRouter, Router, WebSocketRouter -from .ws import WS +from robyn.argument_parser import ArgumentParser +from robyn.dev_event_handler import EventHandler +from robyn.log_colors import Colors +from robyn.processpool import spawn_process +from robyn.responses import jsonify, static_file +from robyn.robyn import Server, SocketHeld +from robyn.router import MiddlewareRouter, Router, WebSocketRouter +from robyn.ws import WS class Robyn: diff --git a/robyn/processpool.py b/robyn/processpool.py index ed1db0ed5..0f34040c4 100644 --- a/robyn/processpool.py +++ b/robyn/processpool.py @@ -1,13 +1,30 @@ import asyncio import logging import multiprocessing as mp +from multiprocessing.process import AuthenticationString import sys -from .events import Events -from .robyn import Server +from robyn.events import Events +from robyn.robyn import Server +from copy import deepcopy -mp.allow_connection_pickling() + +def initialize_event_loop(): + # platform_name = platform.machine() + if sys.platform.startswith("win32") or sys.platform.startswith("linux-cross"): + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + return loop + else: + # uv loop doesn't support windows or arm machines at the moment + # but uv loop is much faster than native asyncio + import uvloop + + uvloop.install() + loop = uvloop.new_event_loop() + asyncio.set_event_loop(loop) + return loop def spawn_process( @@ -28,18 +45,7 @@ def spawn_process( :param workers number: This is the name given to the process to identify the process """ - # platform_name = platform.machine() - if sys.platform.startswith("win32") or sys.platform.startswith("linux-cross"): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - else: - # uv loop doesn't support windows or arm machines at the moment - # but uv loop is much faster than native asyncio - import uvloop - - uvloop.install() - loop = uvloop.new_event_loop() - asyncio.set_event_loop(loop) + loop = initialize_event_loop() server = Server() @@ -81,3 +87,4 @@ def spawn_process( loop.run_forever() except KeyboardInterrupt: loop.close() +