How can the target= and args= be obtained from variables?

Question:

I am new to both stackoverflow and python so please bear over with me

When I run this test program, it doesn’t seem like the threads start the function.
How can the target= and args= be obtained from variables?

import queue
import random
import threading
import time


def start_threads(count, func, args):
    threads =[]
    for _ in range(count):
        thread = threading.Thread(target=func, args=args)
        thread.start
        threads.append(thread)
    return threads


def function(a , b):
    print("Start function")
    time.sleep(random.randint(a, b))
    print("Stop function")


if __name__ == "__main__":
    num_threads = 5
    func_name = "function"
    min_wait = 3
    max_wait = 7

    threads = start_threads(num_threads, func_name, (min_wait,max_wait))

    print(f"Active threads {threading.active_count()}")
Asked By: Svein Ole Salvanes

||

Answers:

You cannot pass a String as a target argument by calling Thread(…). You must provide a function object.

Here is a working solution:

import random
import time
from threading import Thread

def function(a, b):
  print("START FUNCTION")
  time.sleep(random.randint(a, b))
  print("STOP FUNCTION")

def create_threads(count, func, times):
  threads = []
  for _ in range(count):
    thread = Thread(target=func, args=[times[0], times[1]])
    threads.append(thread)
  return threads

def run_threads(threads):
  for thread in threads:
    thread.start()

NUM_THREADS = 5
FUNC_NAME = function
MIN_WAIT = 3
MAX_WAIT = 7

threads = create_threads(NUM_THREADS, FUNC_NAME, (MIN_WAIT, MAX_WAIT))
run_threads(threads)
Answered By: Debo
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.