Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточность и синхронизация 
:(
    Опции темы
bobrob
Дата 24.7.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.7.2008

Репутация: нет
Всего: нет



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

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


Что не так и как это забороть?
PM MAIL   Вверх
setq
Дата 24.7.2008, 19:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Функция Lock() возвращает новый объект. Тот лок, который ты пытаешься release() - совсем не тот лок, которому ты делал acquire(). Ну а первая ошибка с "pop from empty list" вроде бы понятно почему.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.