Skip to content

Commit

Permalink
Fix multiprocessing in windows
Browse files Browse the repository at this point in the history
  • Loading branch information
sansyrox committed Aug 9, 2022
1 parent e862916 commit b45cabc
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 35 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "robyn"
version = "0.17.1"
version = "0.17.1a"
authors = ["Sanskar Jethi <sansyrox@gmail.com>"]
edition = "2018"
description = "A web server that is fast!"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name = "robyn"
version = "0.17.1"
version = "0.17.1a"
description = "A web server that is fast!"
authors = ["Sanskar Jethi <sansyrox@gmail.com>"]

Expand Down
21 changes: 11 additions & 10 deletions robyn/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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()
Expand Down
16 changes: 8 additions & 8 deletions robyn/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
37 changes: 22 additions & 15 deletions robyn/processpool.py
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -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()

Expand Down Expand Up @@ -81,3 +87,4 @@ def spawn_process(
loop.run_forever()
except KeyboardInterrupt:
loop.close()

0 comments on commit b45cabc

Please sign in to comment.