我正在用Python编写一个机器人,为了使其更“人性化”,我需要随机暂停和恢复函数。函数只能在某些定义的点暂停和恢复。
这个机器人由多个函数组成,例如
do_action1(*args)do_action2(*args)do_action3(*args)...start_bot()stop_bot()
函数 start_bot()
按顺序调用 do_action1()
, do_action2()
, … 并传递 *args
。
我需要找到一种方法来随机启动一个 do_actionX()
函数,并在某些点暂停它,然后运行另一个随机的 do_actionX()
函数,再次暂停它并恢复之前的函数,以此类推…
为了随机启动一个函数,我考虑使用包含函数的字典,并从中随机选择一个。
我认为可以使用线程来实现,但由于我的机器人使用多进程,这样做是否正确?使用多线程和多进程是否合适?
我使用多进程来同时运行多个机器人,并通过一个主Python脚本管理它们,该脚本连接到一个界面。每个机器人实例连接到不同的账户。
如果使用多线程,我如何让函数在某些定义的点停止,而不是随机停止?
例如:
def do_action1(*args): print("something") # 做其他事情 # <--- 在此点函数可以被暂停 print("something") # <--- 在此点函数不能被暂停! print("else") # <--- 在此点函数可以再次被暂停
函数被暂停的时间必须是随机的。有没有办法做到这一点?
使用线程是解决这个问题的正确方法吗?
回答:
你可以使用 yield
关键字来创建协程。这里有一个例子:
import randomrandom.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) returnbot(do_action1, do_action2, do_action3)