[ 문제 상황 ]

 

    t.start()
  File "/usr/lib64/python3.6/threading.py", line 842, in start
    raise RuntimeError("threads can only be started once")
RuntimeError: threads can only be started once

 

 

 

 [ 문제 소스 예시 ]

 

import threading
import time

def long_task():
    for i in range(5):
        time.sleep(1)
        print('Working : ' + str(i))

print('Start')

threads_list = list()

for i in range(5):
    t = threading.Thread(target=long_task)
    threads_list.append(t)

for i in threads_list:
        t.start()

for i in threads_list:
    t.join()

print('End')

 

 

 

 

 [ 문제 원인 ]

 

 하나의 쓰레드 객체를 동시에 여러번 실행하려고 시도했기 때문에 발생하는 문제입니다.

 

 

 

 

 [ 해결 방법 ]

 

 여러 작업이 동시 진행되기를 원하면, 쓰레드 객체는 추가적으로 생성하여 각각의 객체에 동일한 작업을 넣어주어 실핸하도록 소스를 수정해주면 됩니다.

 

 아래는 위 전체 소스의 일부인데, t라는 쓰레드의 객체를 생성해 threads_list 라는 리스트에 정상적으로 잘 넣은것까지는 문제 없습니다.

for i in range(5):
    t = threading.Thread(target=long_task)
    threads_list.append(t)

 

for i in threads_list:
        t.start()

for i in threads_list:
    t.join()

 바로 위 소스를 확인해보시면, 위의 t 라는 쓰레드 객체를 threads_list 개수만큼 실행하고 그 실행 결과를 기다리는 내용임을 확인할 수 있는데, 이렇게 하는 것이 아니라, threads_list 안에 들어있는 Thread 객체 5개를 각각 실행하도록 수정해야합니다.

 아래가 수정된 후의 소스입니다.

for i in range(5):
    t = threading.Thread(target=long_task)
    threads_list.append(t)

for t in threads_list:
        t.start()

for t in threads_list:
    t.join()

실행 자체는 각 쓰레드 객체에 대해 한번씩만 실행할 수 있습니다.

 

정상적으로 작동하는 전체 소스는 아래 내용을 참고하시면 됩니다.

import threading
import time

def long_task():
    for i in range(5):
        time.sleep(1)
        print('Working : ' + str(i))

print('Start')

threads_list = list()

for i in range(5):
    t = threading.Thread(target=long_task)
    threads_list.append(t)

for t in threads_list:
        t.start()

for t in threads_list:
    t.join()

print('End')

 

 

 

+ Recent posts