Twisted和python列表并发访问

Twisted和python列表并发访问,python,list,python-2.7,twisted,Python,List,Python 2.7,Twisted,我有一个关于用twisted在python中并发访问列表的问题。 我有一个twisted类将数据添加到列表中,还有一个方法每4秒调用一次。此方法将它转换为列表的元素并执行一些操作。 我担心从OSS和dataReceived访问同一个列表会造成一致性问题。 代码如下: ossStorage=[] def ossPeriodic(): for i in ossStorage: ossStorage.remove(i) db.insertDataToDb(i) rea

我有一个关于用twisted在python中并发访问列表的问题。 我有一个twisted类将数据添加到列表中,还有一个方法每4秒调用一次。此方法将它转换为列表的元素并执行一些操作。 我担心从OSS和dataReceived访问同一个列表会造成一致性问题。 代码如下:

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()
我应该用锁还是类似的东西?
谢谢大家!

您正在使用线程吗?如果没有,则您不能同时访问列表


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

是否使用线程?如果没有,则您不能同时访问列表


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

也许使用队列应该有帮助?也许使用队列应该有帮助?即使他有线程(这不是扭曲的),python的GIL将保护他免受上述代码中出现的任何错误。通常情况下,列表和GIL会遇到麻烦,当您在列表中进行迭代时,某些内容会阻塞,然后其他线程会修改列表。GIL不会防止来自不同线程的并发访问。GIL只确保每个Python操作码都运行到完成,但不确保函数完成。对任何共享数据结构的所有访问(读和写)都必须在线程环境中正确同步,而不仅仅是在列表上进行迭代。我的观点是正确的。看起来Python会在执行一些操作码后周期性地抢占和/或切换线程。即使他有线程(并且没有扭曲),Python的GIL也会保护他不受上述代码中任何错误的影响。通常情况下,列表和GIL会遇到麻烦,当您在列表中进行迭代时,某些内容会阻塞,然后其他线程会修改列表。GIL不会防止来自不同线程的并发访问。GIL只确保每个Python操作码都运行到完成,但不确保函数完成。对任何共享数据结构的所有访问(读和写)都必须在线程环境中正确同步,而不仅仅是在列表上进行迭代。我的观点是正确的。看起来Python会在执行一些操作码后周期性地抢占和/或切换线程。