Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Многопоточность и синхронизация


Автор: bobrob 24.7.2008, 14:28
Подскажите, пожалуйста, по следующему вопросу.
Мне надо вывести элементы массива в многопоточном режиме, причём, потоки не должны иметь доступа к уже используемым или использованным элементам массива.
Посмотрел доки, написал следующий код:
Код

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


Что не так и как это забороть?

Автор: setq 24.7.2008, 19:28
Функция Lock() возвращает новый объект. Тот лок, который ты пытаешься release() - совсем не тот лок, которому ты делал acquire(). Ну а первая ошибка с "pop from empty list" вроде бы понятно почему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)