python - 暂停和恢复功能

标签 python multithreading random artificial-intelligence

我正在用 python 编写一个机器人,为了“人性化”它,我需要随机暂停和恢复功能。 功能只能在某些定义的点暂停和恢复。

机器人由各种功能组成,例如

do_action1(*args)
do_action2(*args)
do_action3(*args)
...
start_bot()
stop_bot()

函数start_bot()按顺序调用do_action1()do_action2()...并给出它们*参数
我需要找到一种方法来随机启动 do_actionX() 函数,并在某些时候暂停它并运行另一个随机 do_actionX() 函数,然后暂停它并恢复上一个函数等等...

要随机启动一个函数,我想我可以使用一本内部有函数的字典并随机选择其中一个。

我认为我可以使用线程来做到这一点,但由于我的机器人正在使用多处理,因此同时使用多线程和多处理是正确的选择吗?
我使用多重处理来同时运行多个机器人,并通过链接到界面的主 Python 脚本来管理它们。每个机器人实例都连接到不同的帐户。

如果我使用多线程,如何使函数停止在某些定义的点而不是随机的?

例如:

def do_action1(*args):
     print("something")
     # do something else
     # <--- at this point the function could be paused
     print("something")
     # <--- at this pint the function cannot be paused!
     print("else")
     # <--- and here the function could be paused again

函数暂停的时间必须是随机的。有办法做到这一点吗?
线程是解决这个问题的正确方法吗?

最佳答案

您可以使用yield关键字来创建协同例程。这是一个例子:

import random
random.seed()

def do_action1():
    print("Hello")
    yield
    print("HELLO!")
    yield
    print("hello?")
def do_action2():
    print("Are you there?")
    yield
    print("ARE YOU THERE!")
    yield
    print("I'm scared.")
def do_action3():
    print("Is somebody out there?")
    yield
    print("SOMEBODY IS OUT THERE!")
    yield
    print("I'm dead.")

def bot(*actions):
    actions = [action() for action in actions]
    while actions:
        action = random.choice(actions)
        try:
            next(action)
        except StopIteration:
            actions.remove(action)
    return

bot(do_action1, do_action2, do_action3)

关于python - 暂停和恢复功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34052364/

相关文章:

postgresql - Postgresql 中的高斯随机分布

python - 使用 imshow 绘制一行又一行

python - Flask 应用程序分为模块的文件夹布局是什么?

python - 使用 openpyxl 将边框应用于范围内的所有单元格

java - 如果 JVM 崩溃了,Thread 还存在吗?

algorithm - 随机快速排序

java - 不明白Math.random()在java中如何工作

python - Tornado 和 Python 3.x

c++ - 在线程应用程序(linux、pthreads)中读取文件大小时出错

Python - 如何创建一个等待给定时间执行函数的新线程