轻松进行单进程分叉
项目描述
轻松进行单进程分叉
基本示例
import forklib
import logging
import os
from time import sleep
logging.basicConfig(level=logging.DEBUG)
def run():
print(
"Proceess #{id} has PID: {pid}".format(
id=forklib.get_id(),
pid=os.getpid()
)
)
sleep(1)
def main():
print("Master proccess has PID: {0}".format(os.getpid()))
forklib.fork(4, run)
if __name__ == '__main__':
main()
此代码创建了4个分叉。尝试运行时,您将看到类似以下内容
Master proccess has PID: 39485 DEBUG:forklib.forking:Starting 4 processes Proceess #1 has PID: 39487 Proceess #0 has PID: 39486 Proceess #2 has PID: 39488 Proceess #3 has PID: 39489 DEBUG:forklib.forking:Child with PID: 39487 Number: 1 exited normally DEBUG:forklib.forking:Child with PID: 39489 Number: 3 exited normally DEBUG:forklib.forking:Child with PID: 39488 Number: 2 exited normally DEBUG:forklib.forking:Child with PID: 39486 Number: 0 exited normally
Forkme将控制分叉。当子进程被杀死或以非零代码退出时,它将立即重启。例如。
Master proccess has PID: 7579 INFO:forklib:Starting 4 processes Proceess #0 has PID: 7580 Proceess #1 has PID: 7581 Proceess #2 has PID: 7582 Proceess #3 has PID: 7583 WARNING:forklib:Child with PID: 7580 Number: 0 killed by signal 9, restarting Proceess #0 has PID: 7584
async_callback示例
import asyncio
import forklib
import logging
import os
from time import sleep
logging.basicConfig(level=logging.DEBUG)
def run():
print(
"Proceess #{id} has PID: {pid}".format(
id=forklib.get_id(),
pid=os.getpid()
)
)
sleep(1)
async def amain():
await asyncio.sleep(0.5)
print("Async callback finished")
def main():
print("Master proccess has PID: {0}".format(os.getpid()))
forklib.fork(
4, run,
async_callback=amain,
# Wait all incomplete async tasks, otherwise cancel (default)
wait_async_callback = True,
)
if __name__ == '__main__':
main()
thread_callback示例
import asyncio
import logging
import os
from time import sleep
from threading import Event
import forklib
logging.basicConfig(level=logging.DEBUG)
def run():
print(
"Proceess #{id} has PID: {pid}".format(
id=forklib.get_id(),
pid=os.getpid(),
),
)
sleep(3)
exit_event = Event()
def thread_callback():
while not exit_event.is_set():
sleep(0.5)
print("Thread callback making great stuff")
print("Thread callback finished")
async def async_callback():
await asyncio.sleep(5)
print("Async callback finished")
def main():
print("Master proccess has PID: {0}".format(os.getpid()))
forklib.fork(
4, run,
thread_callback=thread_callback,
# Wait theread_callback, otherwise exit (default)
# Note: You have to be careful when using this option.
# Thread cancellation is impossible in the general case and you must
# implement your own way of thread exit notification for example
# like following one using exit_callback and threading.Event
wait_thread_callback=True,
# Notifying thread_callback about exit.
exit_callback=exit_event.set,
async_callback=async_callback,
# Wait async_callback, otherwise cancel incomplete tasks (default)
wait_async_callback=True
)
if __name__ == "__main__":
main()
并行迭代
您可以在内存中加载大量元素并在多个进程中处理它们。分叉后,内存将不会复制,而是使用写时复制机制。
from forklib import fork_map
import logging
logging.basicConfig(level=logging.INFO)
def map_func(item):
return item + 1
def main():
for item in fork_map(map_func, range(20000), workers=10):
print(item)
if __name__ == '__main__':
main()
版本控制
此软件遵循语义版本控制
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
forklib-0.5.0.tar.gz (5.8 kB 查看哈希)
构建分发
forklib-0.5.0-py3-none-any.whl (10.1 kB 查看哈希)