【问题标题】:Semaphore output is wrong信号量输出错误
【发布时间】:2016-05-19 17:42:11
【问题描述】:

我正在尝试让信号量在 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 只会让一个进程休眠,所以他们都会先执行第一步然后等待,然后都执行第二步然后等待....
  • 你为什么使用os.fork?您不应该使用multiprocessing 模块的工具来创建流程吗?文档没有说明 multiprocessing 模块如何与手动分叉交互。

标签: python multiprocessing semaphore


【解决方案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 增加并再次上升时,它会一直等到睡眠周期完成。当我们在父级中调用thread.sleep(1) 时,它会等待每个i 值。

【讨论】:

  • 谢谢!我没有把它放在循环的开头,而是把它放在 en 所以它会先打印然后等待
  • 好的,你需要从父进程调用它,这是关键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多