Python 2.7 多处理屏障

Posted

技术标签:

【中文标题】Python 2.7 多处理屏障【英文标题】:Python 2.7 Multiprocessing Barrier 【发布时间】:2015-04-07 04:16:42 【问题描述】:

我使用的是 Python 2.7,并且一直在将多线程代码转换为多处理代码以避免 GIL 锁定问题。但是,我在多处理模块中没有看到障碍实现(有什么想法如何实现吗?)。

我看到了这个问题: Is it possible to use multiprocessing.Event to implement a synchronization barrier for pool of processes? 但我不确定它是否会正常工作,因为它不使用任何锁!

谢谢!

【问题讨论】:

【参考方案1】:

我很确定 multiprocessing 包的内置同步原语可以满足您的需求:https://docs.python.org/2/library/multiprocessing.html#synchronization-primitives

【讨论】:

好的,谢谢。我在这个线程中找到了这段代码:***.com/questions/26622745/…,我希望将它与来自多处理模块的信号量一起使用应该可以正常工作。类屏障: def __init__(self, n): self.n = n self.count = 0 self.mutex = Semaphore(1) self.barrier = Semaphore(0) def wait(self): self.mutex.acquire() self.count = self.count + 1 self.mutex.release() if self.count == self.n: self.barrier.release() self.barrier.acquire() self.barrier.release()【参考方案2】:

这是多处理的类比,至于线程从这里http://***.com/questions/26622745/implementing-barrier-in-python2-7:

from multiprocessing import Process, Semaphore, Value

class Barrier:
    def __init__(self, n):
        self.n       = n
        self.count   = Value('i', 0)
        self.mutex   = Semaphore(1)
        self.barrier = Semaphore(0)

    def wait(self):
        self.mutex.acquire()
        self.count.value += 1
        self.mutex.release()

        if self.count.value == self.n:
            self.barrier.release()

        self.barrier.acquire()
        self.barrier.release()

然后是主线程中的使用示例:

barrier = Barrier(2)
process = Process(target = my_second_thread, args = (barrier,))
process.start()

【讨论】:

以上是关于Python 2.7 多处理屏障的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 2.7 引发属性错误的多处理

如何在python 2.7中使用pymongo进行多处理池

Windows 上的 Python 2.7,“assert main_name not in sys.modules, main_name”适用于所有多处理示例

python 2.7后的字符串赋值

Python 2.7 学习笔记 异常处理

Python 2.7_多进程获取简书专题数据