【发布时间】:2017-04-29 15:54:09
【问题描述】:
我有问题要问你们。
所以,我的目标是启动 5 个进程。每个人都必须通过一个函数打印他们的名字。最后一件事,不允许任何竞争条件。 我必须用信号量来实现这一切。 执行顺序应该是这样的:
开始 p1 -> p1 结束 -> p2 和 p3 -> p2 和 p3 结束 -> 开始 p4 -> p4 结束 -> p5
这是我目前所拥有的:
from multiprocessing import Process, Semaphore
import time
def start (processName):
semaphore.acquire()
print(processName)
time.sleep(1)
semaphore.release()
if __name__ == '__main__':
semaphoreSize = 1
semaphore = Semaphore(semaphoreSize)
p1 = Process (target = start, args= ('Process 1',))
p2 = Process (target = start, args= ('Process 2',))
p3 = Process (target = start, args= ('Process 3',))
p4 = Process (target = start, args= ('Process 4',))
p5 = Process (target = start, args= ('Process 5',))
p1.start()
p2.start()
p3.start()
p4.start()
p5.start()
p1.join()
p2.join()
p3.join()
p4.join()
p5.join()
【问题讨论】:
-
那么你的问题是什么?
-
“我必须用信号量来实现这一切。”信号量本身是无序的。获取操作会减少计数,如果计数变为零则阻塞并等待,当计数大于零时返回,所有这些都是原子的。 (一个发布原子地递增。)他们基本上告诉你:“资源 X 是否仍然可用?如果是,拿一个让我继续,如果没有,等到它。”那么,你的五个进程可以等待什么资源或资源呢?考虑到对于谁获取资源没有隐含的顺序,单一资源(“任何人都可以继续”)是否足够?
-
好的,所以基本上信号量本身不可能完成特定的流程执行顺序。但是是否有可能在信号量的帮助下得到这样的结果:如果不是进程 1 在队列中(信号量) -> 将进程设置为睡眠 -> 让另一个进程进入队列进行检查?
-
鉴于这看起来像家庭作业,我不会只给你答案,而是从共享和私有的角度来考虑这个问题。您可以/必须设置多少 个共享的东西来安排五个独立的实体(可以将它们想象为 Alice、Bob、Carol、Dave 和 Ellen),仔细按字母顺序(或数字顺序)轮流) 命令?你如何安排事情,以便当 Dave 说“我完成了,你现在走”时,他的意思是 Ellen 现在可以走了? (如果您共享多个仅一个或多个信号量,则有多种解决方案。
标签: python multiprocessing semaphore