跳转到主要内容

轻松进行单进程分叉

项目描述

轻松进行单进程分叉

基本示例

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 查看哈希)

上传于 Python 3

支持者