Python 暂停并恢复一项功能
我正在用python编写一个机器人,为了使它“人性化”,我需要随机暂停和恢复函数。 只能在某些定义点暂停和恢复函数 机器人由多种功能组成,如Python 暂停并恢复一项功能,python,multithreading,random,artificial-intelligence,Python,Multithreading,Random,Artificial Intelligence,我正在用python编写一个机器人,为了使它“人性化”,我需要随机暂停和恢复函数。 只能在某些定义点暂停和恢复函数 机器人由多种功能组成,如 do_action1(*args) do_action2(*args) do_action3(*args) ... start_bot() stop_bot() 函数start\u bot()调用do\u action1(),do\u action2()。。。按顺序排列,并给它们指定参数 我需要找到一种方法来随机启动一个do\u actionX()函数,
do_action1(*args)
do_action2(*args)
do_action3(*args)
...
start_bot()
stop_bot()
函数start\u bot()
调用do\u action1()
,do\u action2()
。。。按顺序排列,并给它们指定参数
我需要找到一种方法来随机启动一个do\u actionX()
函数,并在某些时候暂停它,然后运行另一个随机do\u actionX()
函数,然后暂停它并恢复上一个函数,依此类推
为了随机启动一个函数,我想我可以使用一个包含函数的字典,然后随机选择其中一个
我想我可以用线程来实现这一点,但由于我的机器人使用的是多处理,所以将多线程和多处理结合使用是否是正确的选择?我使用多处理同时运行多个bot,并从链接到接口的主Python脚本管理它们。每个bot实例都连接到不同的帐户 如果使用多线程,如何使函数在某些定义点停止,而不是随机停止 例如:
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
def do_action1(*args):
打印(“某物”)
#做点别的
#线程是一种很好的方法。要暂停该功能,请使用(基于):
我在本例中使用了,但是您可以自由地使用模块或其他任何您喜欢的方式,使时间间隔的随机性成为您喜欢的
线程解决方案将允许同时运行不同的操作。如果您不想允许此操作,请使用单个线程,并按照user1827356的建议使用yield
:
import time, random
# Time range to sleep, in seconds
def randomWait():
sleepMin = 1.0
sleepMax = 5.0
time.sleep(random.uniform(sleepMin, sleepMax))
def do_action1(*args):
print("something")
# do something else
yield
print("something")
print("else")
# Other actions defined similarly
actions = [do_action1(), do_action2(), do_action3()]
while actions:
randomWait()
action = random.choice(actions)
try:
next(action)
except StopIteration:
actions.remove(action)
请注意,在这种情况下,您的操作是生成器。它们基本上是运行您定义的代码的对象,每当它们遇到yield
关键字时,都会存储状态(暂停)。对于单线程应用程序,这可能是最好的方法。您可以使用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)
为什么不在函数中使用yield来暂停呢?如果不需要运行其他函数,则调用相同的函数。这将使你没有复制@Rob的每个机器人有一个线程ᵩ'让我们回答正确。您没有调用这些操作,因此它们永远不会到达第一个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)