首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在带有多处理的Python中触发两次事件

如何在带有多处理的Python中触发两次事件
EN

Stack Overflow用户
提问于 2022-07-07 21:29:49
回答 1查看 91关注 0票数 1

因此,我编写了简单的测试代码,并尝试执行两次事件,但它只工作了一次。在turn_left_e.set()之后,我使用turn_left_e.clear()清除内部标志(我也在代码中检查它),并第二次尝试执行事件,但它不会启动。这是我的代码:

代码语言:javascript
复制
import time
from multiprocessing import Event, Process

def check_light_dir(turn_left_e, turn_right_e):
    while True:
        time.sleep(2)
        var = random.randint(1, 10)
        print(f"var: {var}")
        if var < 5:
            print(f"turn_left_e before set(): {turn_left_e.is_set()}")
            turn_left_e.set()
        else:
            print(f"turn_right_e before set(): {turn_right_e.is_set()}")
            turn_right_e.set()


def turn_left(turn_left_e):
    turn_left_e.wait()
    print(f"turn_left_e after set(): {turn_left_e.is_set()}")
    print("Turning servo left")
    turn_left_e.clear()
    print(f"turn_left_e after clear(): {turn_left_e.is_set()}")


def turn_right(turn_right_e):
    turn_right_e.wait()
    print(f"turn_right_e after set(): {turn_right_e.is_set()}")
    print("Turning servo right")
    turn_right_e.clear()
    print(f"turn_right_e after clear(): {turn_right_e.is_set()}")


def test():
    turn_right_e = Event()
    turn_left_e = Event()

    check_light_dir_p = Process(target=check_light_dir, args=(turn_left_e, turn_right_e,))
    turn_right_p = Process(target=turn_right, args=(turn_right_e,))
    turn_left_p = Process(target=turn_left, args=(turn_left_e,))

    check_light_dir_p.start()
    turn_left_p.start()
    turn_right_p.start()

    check_light_dir_p.join()
    turn_right_p.join()
    turn_left_p.join()


if __name__ == "__main__":
    print("start")
    test()
    print("stop")

输出:

代码语言:javascript
复制
start

var: 4
turn_left_e before set(): False
turn_left_e after set(): True
Turning servo left
turn_left_e after clear(): False

var: 10
turn_right_e before set(): False
turn_right_e after set(): True
Turning servo right
turn_right_e after clear(): False

var: 9
turn_right_e before set(): False

var: 10
turn_right_e before set(): True

var: 2
turn_left_e before set(): False

var: 5
turn_right_e before set(): True

Process finished with exit code -1

所以第一次和第二次迭代伺服移动。有趣的部分从这里开始:在第3次迭代中“set()之前”是假的,在第4次“set()之前”是真的!它似乎触发事件,但没有跳进去-从来没有第二打印“伺服移动.”内部标志被无限地设置为True。

我不明白为什么会发生这种事。我清楚()事件,所以只要条件满足,它们就应该触发,对吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-07 21:43:12

问题是,函数turn_leftturn_right在第一个事件集和它们的进程结束后退出。将while True:放入其中:

代码语言:javascript
复制
...

def turn_left(turn_left_e):
    while True:              # <--------
        turn_left_e.wait()
        print(f"turn_left_e after set(): {turn_left_e.is_set()}")
        print("Turning servo left")
        turn_left_e.clear()
        print(f"turn_left_e after clear(): {turn_left_e.is_set()}")


def turn_right(turn_right_e):
    while True:              # <--------
        turn_right_e.wait()
        print(f"turn_right_e after set(): {turn_right_e.is_set()}")
        print("Turning servo right")
        turn_right_e.clear()
        print(f"turn_right_e after clear(): {turn_right_e.is_set()}")

...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72904441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档