2013-03-20 2 views
0

У меня вопрос с параллельным доступом к списку в python с помощью twisted. У меня есть скрученный класс, который добавляет данные в список и метод, который вызывается каждые 4 секунды. Это метод является элементом списка и выполняет некоторую операцию. Я боюсь, что доступ к тому же списку как из ossPeriodic, так и из dataReceived может создать проблему согласованности. Вот код:Совместимый с Twisted и python список

ossStorage=[] 

def ossPeriodic(): 
for i in ossStorage: 
      ossStorage.remove(i) 
    db.insertDataToDb(i) 
reactor.callLater(4, ossPeriodic) 

class OSS(Protocol): 
    def dataReceived(self, data): 
     account = pickle.loads(data)   
     ossStorage.append(account) 



def main(): 
    ossFactory = Factory() 
    ossFactory.protocol = OSS 
    reactor.listenTCP(50000, ossFactory)  
    reactor.callLater(4, ossPeriodic) 
    reactor.run() 

Должен ли я использовать замок или что-то подобное? Спасибо!

+0

Возможно, использование очереди должно помочь? – asdf

ответ

3

Вы используете потоки? Если нет, то у вас нет параллельного доступа к списку.

Обычно приложение с использованием Twisted не использует потоки. Асинхронная природа Twisted выполняется в одном потоке, обрабатывая каждое событие последовательно. Асинхронный характер обеспечивает параллельное поведение, такое как обработка многих сетевых подключений параллельно, но каждая функция обратного вызова завершается до того, как будет вызвана следующая.

+0

Даже если у него были потоки (и это не было скручено), GIL-файл python защитил бы его от чего-либо не так, как в приведенном выше коде. Где вы, как правило, попадаете в проблемы со списками, а GIL - это когда вы повторяете список, что-то блокирует, а затем какой-то другой поток изменяет список. – fmoo

+1

GIL не защищает от одновременного доступа из отдельных потоков. GIL только гарантирует, что каждый код операции Python запускается до завершения, но не гарантирует, что функция завершится. Весь доступ (как чтение, так и запись) к любой общей структуре данных должен быть правильно синхронизирован в потоковой среде, а не только итерации по списку. – dsh

+0

Я стою исправлены. Похоже, что Python периодически приостанавливает и/или периодически переключает потоки после выполнения некоторого количества кодов операций. – fmoo

Смежные вопросы