【问题标题】:Python multiprocessing - Subprocesses with same PIDPython多处理 - 具有相同PID的子进程
【发布时间】:2022-01-31 03:18:59
【问题描述】:

基本上,我每次调用函数时都会尝试打开一个新进程。问题是当我在函数内部获取 PID 时,即使其他函数尚未完成,PID 与其他函数中的 PID 相同。

我正在用装饰器包装我的函数:

def run_in_process(function):
    """Runs a function isolated in a new process.

    Args:
        function (function): Function to execute.
    """

    def wrapper(*args):
        parent_connection, child_connection = Pipe()
        process = Process(target=function, args=(*args, child_connection))
        process.start()
        response = parent_connection.recv()
        process.join()
        return response

    return wrapper

并像这样声明函数:

@run_in_process
def example(data, pipe):
    print(os.getpid())
    pipe.send("Just an example here!")
    pipe.close()

Obs1.:此代码在 AWS Lambda 中运行。

Obs2.:那些 lambda 在另一个开始之前没有完成,因为这个任务至少需要 10 秒。

Log of execution 1

Log of execution 2

Log of execution 3

您可以在日志中看到每个都是不同的执行,并且它们是在“同一”时间执行的。

问题是:为什么即使知道它们同时运行,它们也有相同的 PID?他们不应该有不同的PID吗?

我必须在一个独立的进程中执行这个功能

【问题讨论】:

    标签: python amazon-web-services aws-lambda multiprocessing python-multiprocessing


    【解决方案1】:

    您的 Lambda 函数可能在 AWS 云中一次在多个容器中运行。如果您一直在使用多个并发请求对函数进行大量测试,那么 AWS 编排很可能会创建额外的实例来处理流量。

    使用无服务器,您会失去对代码执行方式的一些可见性,但这真的很重要吗?

    【讨论】:

    • 哦,我明白了。那么根据我本地机器上的测试,我可以确保这些功能在一个单独的进程中运行?即使 PID 相同(因为它们可能在不同的容器中)
    • 期望在您的代码中运行Process.start() 确实会启动一个新进程。您能否完全“确信”这些功能在单独的进程/内存空间中运行?我想这取决于您对“保证”的定义。通过部署为无服务器解决方案,您要求 AWS 在幕后为您控制大量执行细节。就个人而言,我相信尽管 PID 匹配,您的代码仍在单独的进程中运行。如果您出于合规性原因需要对进程隔离进行深入控制,您可能需要更深入地挖掘...
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2023-04-04
    • 2012-06-16
    相关资源
    最近更新 更多