Найти - Пользователи
Полная версия: Ошибка "RuntimeError: threads can only be started once"
Начало » Python для новичков » Ошибка "RuntimeError: threads can only be started once"
1
izooomrud
Почему код в этом случае отрабатывает
 def test(value):
    print("Thread start with value = " + str(value))
chest = ['one', 'two', 'three', 'four', 'five']
for i in chest:
    threads.append(threading.Thread(target=test, args=(i,)))
for i in threads:
    i.start()
for i in threads:
    i.join()

а в этом выдаёт ошибку “RuntimeError: threads can only be started once”

 def test(value):
    print("Thread start with value = " + str(value))
box = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]
for i in box:
    for k in i:
        threads.append(threading.Thread(target=test, args=(k,)))
    for i in threads:
        i.start()
    for i in threads:
        i.join()

и как это решить?
PEHDOM
     for i in threads:
        i.start()
    for i in threads:
        i.join()
отступы убрать.
xam1816
у вас один и тот же поток во втором случае стартует несколько раз,
это как
 def test(value):
    print("Thread start with value = " + str(value))
chest = ['one', 'two', 'three', 'four', 'five']
th = threading.Thread(target=test, args=(chest[0],))
th.start()# стартанули
th.start()# когда сказали стартануть этот же поток еще раз,вылезла ошибка(стартовать 1 раз,больше не нужно)

вот так в коде выглядит

 import threading
threads = []
def test(value):
    print("Thread start with value = " + str(value))
box = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]
for i in box:
    print('>>>>>>>>>>>>>>>>>>>>>>')
    for k in i:
        threads.append(threading.Thread(target=test, args=(k,)))
    for i in threads:
        print(f'{i}.start()')

 >>>>>>>>>>>>>>>>>>>>>>
<Thread(Thread-1, initial)>.start()
>>>>>>>>>>>>>>>>>>>>>>
<Thread(Thread-1, initial)>.start()
<Thread(Thread-2, initial)>.start()
>>>>>>>>>>>>>>>>>>>>>>
<Thread(Thread-1, initial)>.start()
<Thread(Thread-2, initial)>.start()
<Thread(Thread-3, initial)>.start()
>>>>>>>>>>>>>>>>>>>>>>
<Thread(Thread-1, initial)>.start()
<Thread(Thread-2, initial)>.start()
<Thread(Thread-3, initial)>.start()
<Thread(Thread-4, initial)>.start()
>>>>>>>>>>>>>>>>>>>>>>
<Thread(Thread-1, initial)>.start()
<Thread(Thread-2, initial)>.start()
<Thread(Thread-3, initial)>.start()
<Thread(Thread-4, initial)>.start()
<Thread(Thread-5, initial)>.start()
Process finished with exit code 0

решение выше написали,сначала собрать все потоки,а потом друг за другом один раз запустить
izooomrud
PEHDOM
отступы убрать.
или массив обнулить
 def test(value):
    print("Thread start with value = " + str(value))
box = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]
for i in box:
    for k in i:
        threads.append(threading.Thread(target=test, args=(k,)))
    for i in threads:
        i.start()
    for i in threads:
        i.join()
   threads = []
PEHDOM
izooomrud
или массив обнулить
так у вас тогда никакой многопоточности. Учитывая что в for k in i: всего один элемент, вы просто запускаете поток, ждете пока он отработает, запускаете следующий и т.д.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB