{"id":38940940,"url":"https://github.com/vvanglro/pymultirun","last_synced_at":"2026-01-17T15:52:51.843Z","repository":{"id":282888347,"uuid":"949871431","full_name":"vvanglro/pymultirun","owner":"vvanglro","description":"A multi-process runtime library with health checks","archived":false,"fork":false,"pushed_at":"2025-12-22T18:06:40.000Z","size":62,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-24T07:32:11.176Z","etag":null,"topics":["asyncio","multiprocessing","python","script","task-runner","uvicorn"],"latest_commit_sha":null,"homepage":"https://github.com/vvanglro/pymultirun","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vvanglro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-17T09:20:41.000Z","updated_at":"2025-12-09T03:54:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"b586ff38-b6d5-4b22-a026-69846277b5bc","html_url":"https://github.com/vvanglro/pymultirun","commit_stats":null,"previous_names":["vvanglro/pymultirun"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/vvanglro/pymultirun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vvanglro%2Fpymultirun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vvanglro%2Fpymultirun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vvanglro%2Fpymultirun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vvanglro%2Fpymultirun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vvanglro","download_url":"https://codeload.github.com/vvanglro/pymultirun/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vvanglro%2Fpymultirun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28511851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T13:38:16.342Z","status":"ssl_error","status_checked_at":"2026-01-17T13:37:44.060Z","response_time":85,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asyncio","multiprocessing","python","script","task-runner","uvicorn"],"created_at":"2026-01-17T15:52:51.200Z","updated_at":"2026-01-17T15:52:51.829Z","avatar_url":"https://github.com/vvanglro.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Package version](https://badge.fury.io/py/pymultirun.svg)](https://pypi.python.org/pypi/pymultirun)\n\n## multirun\n\nA multi-process runtime library with health checks, Excerpted from uvicorn.\n\nIf the script needs to use multiple processes and run for a long time, use it.\n\n---\n\n### Installation\n\n```shell\npip install pymultirun\n```\n\n---\n\n### Usage\n\nCreate a script that you want to run in multiple processes, in `example.py`:\n\n```python\nimport socket\n\nfrom multirun import run_multiprocess\nimport asyncio\n\nasync def handle_echo(reader, writer):\n    data = await reader.read(100)\n    message = data.decode()\n    addr = writer.get_extra_info('peername')\n\n    print(f\"Received {message!r} from {addr!r}\")\n\n    print(f\"Send: {message!r}\")\n    writer.write(data)\n    await writer.drain()\n\n    print(\"Close the connection\")\n    writer.close()\n    await writer.wait_closed()\n\nasync def main(sock: socket.socket):\n    server = await asyncio.start_server(\n        handle_echo, sock=sock)\n\n    addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)\n    print(f'Serving on {addrs}')\n\n    async with server:\n        await server.serve_forever()\n\ndef worker(sock: socket.socket) -\u003e None:\n    loop: asyncio.AbstractEventLoop = asyncio.new_event_loop()\n    asyncio.set_event_loop(loop)\n\n    try:\n        loop.run_until_complete(main(sock))\n    except KeyboardInterrupt:\n        pass\n    finally:\n        loop.close()\n\n\nif __name__ == '__main__':\n    with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as sock:\n        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n        sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)\n        sock.bind((\"::\", 8888))\n        run_multiprocess(worker, workers=2, args=(sock, ))\n```\n\nYou can also use the command line, in `example.py`:\n\n```python\nimport os\nimport time\n\ndef worker_function(name: str, age:int, sleep_time=1, **kwargs):\n    pid = os.getpid()\n    count = 0\n    print(f\"Name {name}, Age {age}, Kwargs {kwargs}.\")\n\n    try:\n        while True:\n            time.sleep(sleep_time)\n            count += 1\n            print(f\"Worker {name} (PID: {pid}) - count: {count}\")\n    except KeyboardInterrupt:\n        print(f\"Worker {name} (PID: {pid}) shutting down\")\n```\n\nRun it:\n\n```shell\nmultirun example:worker_function --workers 2 --timeout 3  --args vvanglro --args 23  --kwargs a 1\n```\n\n---\n\n### Signal\n\nYou can use signals to stop the workers:\n\n```shell\nkill -SIGINT \u003cpid\u003e\n```\n\nRestart the workers:\n\n```shell\nkill -SIGHUP \u003cpid\u003e\n```\n\nAdd workers:\n\n```shell\nkill -SIGTTIN \u003cpid\u003e\n```\n\nReduce workers:\n\n```shell\nkill -SIGTTOU \u003cpid\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvvanglro%2Fpymultirun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvvanglro%2Fpymultirun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvvanglro%2Fpymultirun/lists"}