信号量输出错误
Semaphore output is wrong
我正在尝试让信号量在 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)
我是不是思路有误?
time.sleep()
需要从父进程调用才能实现该功能。下面是修改后的代码,相信这就是你想要的:
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)
输出:
sem1: 1
等待
sem2: 2
等待
sem1: 3
等待
sem2: 4
等待
推理:
当您对单个子进程使用 time.sleep(1)
时,只有子进程休眠,父进程不休眠。当i
为奇数时,它(对应的子进程)打印并进入睡眠,但父进程仍然处于活动状态并在i
为偶数时执行子进程。当 i
增加并再次变为 even 时,它会等待直到睡眠周期完成。当我们在父级中调用 thread.sleep(1)
时,它会等待每个 i
值。
我正在尝试让信号量在 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)
我是不是思路有误?
time.sleep()
需要从父进程调用才能实现该功能。下面是修改后的代码,相信这就是你想要的:
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)
输出:
sem1: 1
等待
sem2: 2
等待
sem1: 3
等待
sem2: 4
等待
推理:
当您对单个子进程使用 time.sleep(1)
时,只有子进程休眠,父进程不休眠。当i
为奇数时,它(对应的子进程)打印并进入睡眠,但父进程仍然处于活动状态并在i
为偶数时执行子进程。当 i
增加并再次变为 even 时,它会等待直到睡眠周期完成。当我们在父级中调用 thread.sleep(1)
时,它会等待每个 i
值。