Python - вызов случайной функции и создание потока - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь вызвать функцию случайным образом из списка функций.Когда функция вызывается, я хочу начать новый поток.

Мой код выглядит следующим образом:

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 () в подклассе?

1 Ответ

0 голосов
/ 17 сентября 2018

Функция, которая передается run_threaded, всегда будет одинаковой, поэтому вам нужно либо сделать случайный выбор внутри run_threaded, либо сделать это внутри функции, которую вы предоставляете в schedule.every(1).minutes.do(...).

Ваш второй код сделал случайный выбор работы и сразу же запустил его. Если мы обернем этот код в функцию, чтобы выбор задания + вызов выполнялись, когда run_threaded вызывает эту функцию, она будет делать то, что вы хотите. lambda будет хорошо вписываться, здесь.

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