怎么样多处理.有界信号量不同于多处理管理器().有界信号灯?

2024-09-27 21:24:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解multiprocessing.BoundedSemaphoremultiprocessing.Manager().BoundedSemaphore之间的区别。你知道吗

下面是一个使用multiproessing.BoundedSemaphore的程序。你知道吗

#!/usr/bin/env python
import multiprocessing
import time

def f(i, sem):
    print 'worker %d is working ...' % i
    time.sleep(5)
    sem.release()
    print 'worker %d is done' % i

def master():

    plist = []
    sem = multiprocessing.BoundedSemaphore(3)

    for i in range(10):
        p = multiprocessing.Process(target=f, args=(i, sem))
        sem.acquire()
        p.start()
        plist.append(p)

    print 'waiting for processes to join ...'
    for p in plist:
        p.join()

    print 'master is done'

master()
print 'script is done'

这是输出。你知道吗

$ python sem1.py 
worker 0 is working ...
worker 1 is working ...
worker 2 is working ...
worker 0 is done
worker 1 is done
worker 2 is done
worker 3 is working ...
worker 4 is working ...
worker 5 is working ...
worker 3 is done
worker 4 is done
worker 5 is done
worker 6 is working ...
worker 7 is working ...
worker 8 is working ...
worker 6 is done
worker 7 is done
worker 8 is done
waiting for processes to join ...
worker 9 is working ...
worker 9 is done
master is done
script is done

现在我将信号量创建代码改为:

    sem = multiprocessing.BoundedSemaphore(3)

    sem = multiprocessing.Manager().BoundedSemaphore(3)

我再次运行新程序。它以与以前相同的行为生成与以前相同的输出。这是这一变化的完整程序。你知道吗

#!/usr/bin/env python
import multiprocessing
import time

def f(i, sem):
    print 'worker %d is working ...' % i
    time.sleep(5)
    sem.release()
    print 'worker %d is done' % i

def master():

    plist = []
    sem = multiprocessing.Manager().BoundedSemaphore(3)

    for i in range(10):
        p = multiprocessing.Process(target=f, args=(i, sem))
        sem.acquire()
        p.start()
        plist.append(p)

    print 'waiting for processes to join ...'
    for p in plist:
        p.join()

    print 'master is done'

master()
print 'script is done'

我的问题:

  1. multiprocessing.BoundedSemaphoremultiprocessing.Manager().BoundedSemaphore有何不同?你知道吗
  2. 当一个人想使用multiprocessing.Manager().BoundedSemaphore而使用multiprocessing.BoundedSemaphore会产生不同的结果时,他会在什么时候使用呢?你知道吗

Tags: importmasterfortimeismanagermultiprocessingworking

热门问题