Как я могу создавать неблокирующие потоки? - PullRequest
0 голосов
/ 18 мая 2018

Я пытался использовать потоки в Python.Я работаю над проектом аппаратного обеспечения Pi.

Вот проблема:

Когда я создаю поток и вызываю его так, цикл продолжает создавать новые потоки до того, какстарые закончены.Следовательно, замедление работы программы ... (при печати «threading.active_count» отображается более 20 активных потоков).

while True:
    t4 = Thread(target = myFunc, args=())
    t4.start()

    print("Hello World")

Мне нужен процесс многопоточности, который снова и снова запускает одну и ту же функцию на ОДИНОЧНАЯ тема, не затрагивающая и не задерживающая мою основную программу.то есть когда поток завершил выполнение функции, запустите ее снова ... но моим основным должен все еще быть вывод "Hello World" в обычном режиме.

Я нашел один способ остановить его аварийное завершение, а именно:сидеть и "ждать", пока нить не закончится, а затем начать снова.Тем не менее, это блокирующий подход, который полностью отрицает необходимость использования многопоточности.

while True:
    t4 = Thread(target = myFunc, args=())
    t4.start()
    t4.join()

    print("Hello World")

Есть предложения?

Ответы [ 4 ]

0 голосов
/ 18 мая 2018

Вы можете использовать multiprocessing.pool.ThreadPool для управления как запуском новых потоков, так и ограничением максимального числа одновременно выполняющихся потоков.

from multiprocessing.pool import ThreadPool
from random import randint
import threading
import time

MAX_THREADS = 5  # Number of threads that can run concurrently.
print_lock = threading.Lock()  # Prevent overlapped printing from threads.

def myFunc():
    time.sleep(random.randint(0, 1))  # Pause a variable amount of time.
    with print_lock:
        print('myFunc')

def test():
    pool = ThreadPool(processes=MAX_THREADS)

    for _ in range(100):  # Submit as many tasks as desired.
        pool.apply_async(myFunc, args=())

    pool.close()  # Done adding tasks.
    pool.join()  # Wait for all tasks to complete.
    print('done')


if __name__ == '__main__':
    test()
0 голосов
/ 18 мая 2018

Создайте поток делегата - то есть поток для последовательного запуска других потоков:

def delegate(*args):
    while True:
        t = Thread(target=myFunc, args=args) # or just call myFunc(*args) instead of a thread
        t.start()
        t.join()

t = Thread(target=delegate, args=())
t.start()
while True:
    print("Hello world!")

Или, что еще лучше, перепроектируйте ваш myFunc(), чтобы запустить его логику в цикле while True: ... и запуститьпоток только один раз.

Я бы также посоветовал вам добавить некоторую задержку (например, time.sleep()), если вы не выполняете какую-либо работу в своих потоках, чтобы помочь с переключением контекста.

0 голосов
/ 18 мая 2018

Мне нужен процесс многопоточности, который снова и снова запускает одну и ту же функцию в единственном потоке

Этот фрагмент создает единый поток, который непрерывно вызывает myFunc().

* 1007.*
0 голосов
/ 18 мая 2018

setDaemon(True) от threading.Thread класс еще здесь https://docs.python.org/2/library/threading.html#threading.Thread.daemon

...