Как динамически создавать несколько потоков в Python - PullRequest
1 голос
/ 05 апреля 2019

Я создаю код на Python, в котором есть функция, которая должна запускаться столько раз, сколько пользователь запрашивает с помощью потоков. Например:

import time
T = input("Enter the number of times the function should be executed")
L = [1,2,3,4]

def sum(Num):
    for n in Num:
        time.sleep(0.2)
        print("square:",n*n)

Исходя из значения T от пользователя, я хочу, чтобы динамически создавалось число потоков T и выполнялась функция суммирования в отдельных потоках.

Если пользователь вводит как 4, тогда мне нужно динамически создать 4 потока и выполнить одну и ту же функцию с 4 различными потоками. Пожалуйста, помогите мне создать 4 несколько тем. Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

S U П Σ Y Λ ответ хорошо объясняет, как использовать многопоточность, но не учитывает пользовательский ввод, который, согласно вашему вопросу, определяет количество потоков. Исходя из этого, вы можете попробовать:

import threading, time

def _sum(n):
    time.sleep(0.2)
    print(f"square: {n*n}")

while 1:

    t = input("Enter the number of times the function should be executed:\n").strip()
    try:
        max_threads = int(t)
        for n in range(0, max_threads):
            threading.Thread(target=_sum, args=[n]).start()
    except:
        pass
        print("Please type only digits (0-9)")
        continue

    print(f"Started {max_threads} threads.")

    # wait threads to finish
    while threading.active_count() > 1:
        time.sleep(0.5)

    t = input("Create another batch (y/n)?\n").lower().strip() #
    if t != "y":
        print("Exiting.")
        break

Примечания:

  1. Избегайте создания функций с тем же именем, что и встроенные функции, например sum(), используйте _sum() или похожее имя;
  2. Python - это caSe SenSiTive , что означает, что Def не совпадает с def, то же самое происходит For / for;
  3. Заключайте строки в одинарные ' или двойные кавычки ", не ;
  4. Live Demo - Python 3.6;
  5. Asciinema video .
0 голосов
/ 05 апреля 2019

Это зависит от ваших потребностей, у вас есть несколько способов сделать. Вот два примера, подходящих для вашего случая

с резьбовым модулем

Если вы хотите создать N темы и дождаться их окончания. Вы должны использовать модуль threading и импортировать Thread.

from threading import Thread

# Start all threads. 
threads = []
for n in range(T):
    t = Thread(target=sum, args=(L,))
    t.start()
    threads.append(t)

# Wait all threads to finish.
for t in threads:
    t.join()

с резьбовым модулем

В противном случае, если вы не хотите ждать. Я настоятельно советую вам использовать модуль thread (переименованный _thread начиная с Python3) .

from _thread import start_new_thread

# Start all threads and ignore exit.
for n in range(T):
    start_new_thread(sum, (L,))

(args,) - это кортеж. Вот почему L в парантезах.

...