扭曲和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()
我应该使用锁或类似的东西吗? 谢谢!
你使用线程吗?如果没有,那么你没有并发访问列表。
通常,使用Twisted的应用程序不使用线程。 Twisted的异步性质在单个线程中按顺序处理每个事件。异步性质提供类似并发的行为,例如并行处理多个网络连接,但每个回调函数在调用下一个函数之前运行完成。
即使他有线程(并没有扭曲),python的GIL将保护他免受上述代码中的任何错误。 如果你通常遇到列表的问题,而GIL是当你遍历列表,某些块,然后一些其他线程修改列表。 – fmoo 2013-03-21 16:37:43
GIL不能防止来自单独线程的并发访问。 GIL只确保每个Python操作码都运行完成,但不能确保函数完成。对任何共享数据结构的所有访问(包括读取和写入)必须在线程环境中正确同步,而不仅仅是遍历列表。 – dsh 2013-03-21 22:16:46
我站好了。看起来Python会在执行一些操作码后周期性地抢占和/或切换线程。 – fmoo 2013-03-23 04:54:41
也许使用队列应该有帮助吗? – asdf 2013-03-20 22:01:49