暂停和恢复功能

2024-05-16 03:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

函数start_bot()调用do_action1()do_action2()。。。并给出*args
我需要找到一种随机启动do_actionX()函数的方法,在某些情况下暂停它并运行另一个随机do_actionX()函数,然后暂停它并继续上一个函数,依此类推。。。在

要随机启动一个函数,我想我可以使用一个包含函数的字典,然后随机选择其中一个。在

我想我可以用线程来实现这一点,但是既然我的机器人使用多处理,那么将多线程和多处理一起使用是不是一个正确的选择?
我使用多处理来同时运行多个bot,并从链接到接口的主Python脚本管理它们。每个bot实例连接到不同的帐户。在

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

例如:

^{pr2}$

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


Tags: 方法函数功能定义botargs机器人线程
2条回答

线程是一种很好的方法。要暂停函数,请使用^{}(基于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()

我在这个例子中使用了^{},但是您可以随意地使用^{}模块或任何其他您喜欢的东西来设置区间的随机性。在

线程解决方案将允许不同的操作同时运行。如果不允许这样做,请使用一个线程并按照user1827356的建议使用yield

^{pr2}$

请注意,在本例中,您的操作是生成器。它们基本上是运行您定义的代码的对象,并在每次碰到yield关键字时存储状态(暂停)。对于单线程应用程序,这可能是最好的方法。在

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

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)

相关问题 更多 >