暂停和恢复功能
Pause and resume a function
我正在 python 中编写一个机器人,为了 "humanize" 我需要随机暂停和恢复功能。
只能在某些定义的点暂停和恢复功能。
机器人由各种功能组成,例如
do_action1(*args)
do_action2(*args)
do_action3(*args)
...
start_bot()
stop_bot()
函数start_bot()
按顺序调用do_action1()
,do_action2()
,...并给出它们*args
.
我需要找到一种方法来随机启动 do_actionX()
函数并在某些时候暂停它,然后 运行 另一个随机 do_actionX()
函数然后暂停它并恢复前一个等等......
要随机启动一个函数,我想我可以使用一个里面有函数的字典,然后随机选择一个函数。
我想我可以用线程来做到这一点,但由于我的机器人正在使用多处理,同时使用多线程和多处理是否是一个正确的选择?
我同时对 运行 多个机器人使用 multiprocessing,并通过链接到界面的主 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
函数暂停的次数必须是随机的。有办法吗?
线程是解决此问题的正确方法吗?
线程是一种很好的方法。要暂停函数,请使用 time.sleep()
, (based on How can I make a time delay in Python?):
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
randomWait()
print("something")
print("else")
randomWait()
我使用了 random.uniform
in this example, but you are free to make the randomness of the interval as fancy as you would like using the random
模块或您喜欢的任何其他模块。
线程解决方案将允许同时执行不同的操作 运行。如果您不想允许这样做,请使用单线程并使用 yield
作为 user1827356 建议:
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)
我正在 python 中编写一个机器人,为了 "humanize" 我需要随机暂停和恢复功能。 只能在某些定义的点暂停和恢复功能。
机器人由各种功能组成,例如
do_action1(*args)
do_action2(*args)
do_action3(*args)
...
start_bot()
stop_bot()
函数start_bot()
按顺序调用do_action1()
,do_action2()
,...并给出它们*args
.
我需要找到一种方法来随机启动 do_actionX()
函数并在某些时候暂停它,然后 运行 另一个随机 do_actionX()
函数然后暂停它并恢复前一个等等......
要随机启动一个函数,我想我可以使用一个里面有函数的字典,然后随机选择一个函数。
我想我可以用线程来做到这一点,但由于我的机器人正在使用多处理,同时使用多线程和多处理是否是一个正确的选择?
我同时对 运行 多个机器人使用 multiprocessing,并通过链接到界面的主 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
函数暂停的次数必须是随机的。有办法吗?
线程是解决此问题的正确方法吗?
线程是一种很好的方法。要暂停函数,请使用 time.sleep()
, (based on How can I make a time delay in Python?):
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
randomWait()
print("something")
print("else")
randomWait()
我使用了 random.uniform
in this example, but you are free to make the randomness of the interval as fancy as you would like using the random
模块或您喜欢的任何其他模块。
线程解决方案将允许同时执行不同的操作 运行。如果您不想允许这样做,请使用单线程并使用 yield
作为 user1827356 建议:
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)