相关疑难解决方法(0)

Python在进程之间共享锁定

我试图使用部分函数,​​以便pool.map()可以定位具有多个参数的函数(在本例中为Lock()对象).

这是示例代码(取自我之前的一个问题的答案):

from functools import partial

def target(lock, iterable_item):
    for item in items:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def main():
    iterable = [1, 2, 3, 4, 5]
    pool = multiprocessing.Pool()
    l = multiprocessing.Lock()
    func = partial(target, l)
    pool.map(func, iterable)
    pool.close()
    pool.join()
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码时,我收到错误:

Runtime Error: Lock objects should only be shared between processes through inheritance.
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?如何在子进程之间共享锁?

python share locking multiprocessing

41
推荐指数
1
解决办法
4万
查看次数

Python:在生成的进程之间共享锁

最终目标是在后台执行一个方法,但不是并行:当多个对象调用此方法时,每个对象都应该等待轮到它们继续执行。为了实现在后台运行,我必须在子进程(而不是线程)中运行该方法,并且我需要使用spawn(而不是fork)来启动它。为了防止并行执行,显而易见的解决方案是在进程之间共享全局锁。
当进程被分叉时(这是 Unix 上的默认设置),很容易实现,如以下两个代码中所强调的那样。
我们可以将它作为类变量共享:

import multiprocessing as mp
from time import sleep

class OneAtATime:

    l = mp.Lock()

    def f(self):
        with self.l:
            sleep(1)
        print("Hello")

if __name__ == "__main__":
    a = OneAtATime()
    b = OneAtATime()
    p1 = mp.Process(target = a.f)
    p2 = mp.Process(target = b.f)
    p1.start()
    p2.start()
Run Code Online (Sandbox Code Playgroud)

或者我们可以将它传递给方法:

import multiprocessing as mp
from time import sleep

class OneAtATime:
    def f(self, l):
        with l:
            sleep(1)
        print("Hello")

if __name__ == "__main__":
    a = OneAtATime()
    b = OneAtATime()
    m = mp.Manager()
    l = mp.Lock() …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing python-multiprocessing

6
推荐指数
1
解决办法
2828
查看次数