信号量输出是错误的

时间:2016-05-19 17:42:11

标签: python multiprocessing semaphore

我正在尝试让信号量在python中工作,但由于某种原因,它们不会像我希望的那样工作。 我希望他们一次打印一个数字,如:

sem1: 1
wait
sem2: 2
wait
sem1: 3
wait
sem2: 4

但输出如下:

sem1: 1
sem2: 2
wait
sem1: 3
sem2: 4

这是我的代码:

import os, multiprocessing, time

sem1 = multiprocessing.Semaphore(1)
sem2 = multiprocessing.Semaphore(0)

pid1 = os.fork()
pid2 = -1

if pid1 != 0:
    pid2 = os.fork()
for i in range(1,20):
    if (i%2) == 1 and pid1==0:
            sem1.acquire()
            print("sem1: %d" %i)
            sem2.release()
            time.sleep(1)
    elif (i%2) == 0 and pid2==0:
            sem2.acquire()
            print("sem2: %d" %i)
            sem1.release()
            time.sleep(1)

我在思考中犯了错误吗?

1 个答案:

答案 0 :(得分:0)

需要从父进程调用

<img src="~/Uploads/postfinance.PNG" alt="Image" /> 来实现功能。以下是修改后的代码,我相信这就是你想要的:

time.sleep()

输出:

sem1:1

等待

sem2:2

等待

sem1:3

等待

sem2:4

等待

推理:

当您对单个子进程使用import os, multiprocessing, time sem1 = multiprocessing.Semaphore(1) sem2 = multiprocessing.Semaphore(0) pid1 = os.fork() pid2 = -1 if pid1 != 0: pid2 = os.fork() for i in range(1,20): time.sleep(1) if (i%2) == 1 and pid1==0: sem1.acquire() print("sem1: %d" %i) sem2.release() #time.sleep(1) elif (i%2) == 0 and pid2==0: sem2.acquire() print("sem2: %d" %i) sem1.release() #time.sleep(1) 时,只有该子进程才会休眠父进程。当time.sleep(1)为奇数时,它(相应的子进程)打印并进入休眠状态,但父进程仍处于活动状态,并在i为偶数时执行子进程。当i增加并再次进行时,它会一直等到睡眠周期结束。当我们在父级中调用i时,它会等待每个thread.sleep(1)值。