Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2008 15:12:24

bobrob
От:
Зарегистрирован: 2008-07-24
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и синхронизированный доступ к элементам массива

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

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 - Item1
thread - Item2
thread - Item3
thread - Item4
thread - Item5
thread - Item6
thread - 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
Где допущена ошибка и как её забороть?



Офлайн

#2 Июль 24, 2008 15:25:26

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и синхронизированный доступ к элементам массива

>>> import Queue
>>> help(Queue)



Офлайн

#3 Июль 24, 2008 17:02:06

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки и синхронизированный доступ к элементам массива

Ты эта… каждый раз создаешь новый объект блокировки.

threading.Lock().acquire()
threading.Lock().release()
Создай нужный объект глобально и потом уже юзай его.
l = threading.Lock()
.....
l.acquire()
.....
.release()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version