Python 多处理,特定顺序

Python 多处理,特定顺序,python,multiprocessing,semaphore,Python,Multiprocessing,Semaphore,我有个问题要问你们 因此,我的目标是启动5个流程。每个人都必须通过一个函数打印自己的名字。最后一件事,不允许任何比赛条件。 我必须通过信号量来实现这一切。 执行顺序应如下所示: 开始p1->p1结束->p2和p3->p2和p3结束->开始p4->p4结束->p5 以下是我到目前为止的情况: from multiprocessing import Process, Semaphore import time def start (processName): semaphore.acqui

我有个问题要问你们

因此,我的目标是启动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()

谢谢你对托瑞克的帮助

我的解决方案如下所示:

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()

那么你的问题是什么呢?“我必须用信号量来实现这一切。”信号量本身是不有序的。acquire操作递减计数,如果计数变为零,则阻塞并等待,当计数大于零时返回,所有操作都是原子式的。(一个原子级的版本)他们基本上会告诉你:“资源X仍然可用吗?如果是,拿一个,让我继续,如果不是,等它出现。”那么,你的五个进程可以等待什么资源呢?一个单一的资源(“任何人都可以继续”)就足够了,因为对于谁获得资源没有隐含的顺序?好的,所以信号量本身基本上不可能完成特定的进程执行顺序。但是,在信号量的帮助下,是否有可能得到这样的结果:如果进程1不在队列中(信号量)->将进程设置为睡眠->将另一个进程放入队列以进行检查?鉴于这看起来像是家庭作业,我不打算仅仅给出答案,而是从共享和私有的角度来考虑。你可以/必须设置多少共享的东西来安排五个独立的实体,比如Alice、Bob、Carol、Dave和Ellen,也许要小心地按字母(或数字)顺序轮流?当戴夫说“我做完了,你现在就走”的时候,你怎么能安排事情呢?他具体的意思是艾伦现在可以走了?(如果共享的信号量不止一个或多个,则有多种解决方案。)