[ 문제 상황 ]
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')
'Development > Python' 카테고리의 다른 글
[Python] 정규표현식 표현법 - 기초 (0) | 2020.07.15 |
---|---|
[Python][라이브러리] threading 활용 기초 예시 (0) | 2020.07.15 |
[Python][라이브러리] random 활용 (0) | 2020.07.13 |
[Python][라이브러리] calendar 활용 (0) | 2020.07.13 |
[Python][라이브러리] os, shutil, glob 활용 (0) | 2020.07.13 |