Python - 调用随机函数并创建一个线程

问题描述 投票:1回答:1

我试图从函数列表中随机调用函数。调用该函数时,我想启动一个新线程。

我的代码看起来像这样:

jobs = [func1, func2, func3, func4]

def run_threaded(job_func):
    info("Number of active threads: " + str(threading.active_count()))
    info("Threads list length: " + str(len(threading.enumerate())))
    job_thread = threading.Thread(target=job_func)
    job_thread.start()
    job_thread.join()

当我调用没有括号的函数时,每隔一分钟就会反复调用相同的函数。即

schedule.every(1).minutes.do(run_threaded, random.choice(jobs))

当我用额外的括号调用函数,即

schedule.every(1).minutes.do(run_threaded, random.choice(jobs)())

我收到以下错误:

Exception in thread Thread-7:
Traceback (most recent call last):
  File "C:\Users\(USER)\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:\Users\(USER)\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
TypeError: 'bool' object is not callable

它是否期望作为一个参数?我是否必须覆盖子类中的run()方法?

python-3.x python-multithreading
1个回答
0
投票

移交给run_threaded的函数总是相同的,所以你需要在run_threaded中进行随机选择,或者在schedule.every(1).minutes.do(...)中提供的函数内部进行。

您的第二个代码执行随机作业选择并立即运行它。如果我们将该代码包装在一个函数中,以便在run_threaded调用此函数时完成作业选择+调用,它将执行您想要的操作。 lambda很适合这里。

schedule.every(1).minutes.do(run_threaded, lambda:random.choice(jobs)())
© www.soinside.com 2019 - 2024. All rights reserved.