2013-03-20 3 views
0

나는 twisted와 함께 python으로 목록에 동시에 액세스 할 수있는 질문이 있습니다. 목록에 데이터를 추가하는 꼬인 클래스와 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은 위의 코드에서 잘못된 점으로부터 그를 보호 할 것입니다. 일반적으로 목록에 문제가 생기고 GIL은 목록 전체를 반복 할 때 차단되고 다른 블록이 목록을 수정합니다. – fmoo

+1

GIL은 별도의 스레드에서 동시에 액세스하지 못하도록 보호하지 않습니다. GIL은 각 Python opcode가 완료 될 때까지만 실행되지만 함수가 완료되는 것을 보장하지는 않습니다. 모든 공유 데이터 구조에 대한 모든 액세스 (읽기 및 쓰기 모두)는 목록에 대한 반복이 아닌 스레드 된 환경에서 올바르게 동기화되어야합니다. – dsh

+0

나는 고쳐졌다. 파이썬은 주기적으로 주기적으로 스레드를 선점 및/또는 일부 opcode를 실행 한 후 정기적으로 전환합니다. – fmoo