【问题标题】:Multiprocessing, specific order多处理,特定顺序
【发布时间】: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


【解决方案1】:

感谢您的帮助!

我的解决方案现在看起来像这样:

def start(processName):
    if processName == 'Process 1':
        semaphore1.acquire()
        print(processName)
        time.sleep(1)
        semaphore2.release()
        semaphore3.release()
    elif processName == 'Process 2':
        semaphore2.acquire()
        print(processName)
        time.sleep(1)
        semaphore4.release()
    elif processName == 'Process 3':
        semaphore3.acquire()
        print(processName)
        time.sleep(1)
        semaphore4.release()
    elif processName == 'Process 4':
        semaphore4.acquire()
        semaphore4.acquire()
        print(processName)
        time.sleep(1)
        semaphore5.release()
    else:
        semaphore5.acquire()
        print(processName)
        time.sleep(1)
        semaphore5.release()

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多