相关疑难解决方法(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:为什么这里的进程之间共享多处理锁?

我试图在进程之间共享一个锁。我知道共享锁的方法是将其作为参数传递给目标函数。但是我发现,即使下面的方法也有效。我无法理解进程共享此锁的方式。有人可以解释吗?

import multiprocessing as mp
import time


class SampleClass:

    def __init__(self):
        self.lock = mp.Lock()
        self.jobs = []
        self.total_jobs = 10

    def test_run(self):
        for i in range(self.total_jobs):
            p = mp.Process(target=self.run_job, args=(i,))
            p.start()
            self.jobs.append(p)

        for p in self.jobs:
            p.join()

    def run_job(self, i):
        with self.lock:
            print('Sleeping in process {}'.format(i))
            time.sleep(5)


if __name__ == '__main__':
    t = SampleClass()
    t.test_run()
Run Code Online (Sandbox Code Playgroud)

python locking multiprocessing python-3.x shared-variable

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