Подскажите, пожалуйста, по следующему вопросу. Мне надо вывести элементы массива в многопоточном режиме, причём, потоки не должны иметь доступа к уже используемым или использованным элементам массива. Посмотрел доки, написал следующий код:
Код | import threading import time
arr = ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"]
def iter(thread): while len(arr) > 0: time.sleep(0.01) print "thread [%d] - %s" % (thread, arr.pop(0)) class MyThread(threading.Thread): def __init__(self): super(MyThread, self).__init__() self.threadID = None def run(self): threading.Lock().acquire() iter(self.threadID) threading.Lock().release()
for x in range(3): t = MyThread() t.threadID = x t.start()
|
С задачей скрипт справляется, потоки выводят элементы массива, не повторяя их: thread [0] - Item1 thread [1] - Item2 thread [2] - Item3 thread [0] - Item4 thread [1] - Item5 thread [2] - Item6 thread [0] - Item7
Но в конце вылазит ошибка:
Код | Exception in thread Thread-2: Traceback (most recent call last): File "C:\Python25\lib\threading.py", line 462, in __bootstrap self.run() File "c:\Python-Coding\classTest1\threads.py", line 18, in run iter(self.threadID) File "c:\Python-Coding\classTest1\threads.py", line 10, in iter print "thread [%d] - %s" % (thread, arr.pop(0)) IndexError: pop from empty list
Exception in thread Thread-3: Traceback (most recent call last): File "C:\Python25\lib\threading.py", line 462, in __bootstrap self.run() File "c:\Python-Coding\classTest1\threads.py", line 18, in run iter(self.threadID) File "c:\Python-Coding\classTest1\threads.py", line 10, in iter print "thread [%d] - %s" % (thread, arr.pop(0)) IndexError: pop from empty list
Exception in thread Thread-1: Traceback (most recent call last): File "C:\Python25\lib\threading.py", line 462, in __bootstrap self.run() File "c:\Python-Coding\classTest1\threads.py", line 19, in run threading.Lock().release() error: release unlocked lock
|
Что не так и как это забороть? |