扭曲和python列表并发访问

扭曲和python列表并发访问

问题描述:

我有一个与扭曲的Python并发访问列表的问题。 我有一个扭曲的类,它将数据添加到列表中,并且每4秒调用一次该方法。这个方法是列表的元素并且执行一些操作。 我担心从ossPeriodic和从dataReceived访问相同的列表都可能导致一致性问题。 这里是代码:扭曲和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 2013-03-20 22:01:49

你使用线程吗?如果没有,那么你没有并发访问列表。

通常,使用Twisted的应用程序不使用线程。 Twisted的异步性质在单个线程中按顺序处理每个事件。异步性质提供类似并发的行为,例如并行处理多个网络连接,但每个回调函数在调用下一个函数之前运行完成。

+0

即使他有线程(并没有扭曲),python的GIL将保护他免受上述代码中的任何错误。 如果你通常遇到列表的问题,而GIL是当你遍历列表,某些块,然后一些其他线程修改列表。 – fmoo 2013-03-21 16:37:43

+1

GIL不能防止来自单独线程的并发访问。 GIL只确保每个Python操作码都运行完成,但不能确保函数完成。对任何共享数据结构的所有访问(包括读取和写入)必须在线程环境中正确同步,而不仅仅是遍历列表。 – dsh 2013-03-21 22:16:46

+0

我站好了。看起来Python会在执行一些操作码后周期性地抢占和/或切换线程。 – fmoo 2013-03-23 04:54:41