我正在用 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/