2013-03-18 2 views
0

파이썬 백엔드 서버가있는 멀티 플레이어 플래시 게임을하고 있는데, 서버에 문제가 있습니다.내 목록이 일관되게 부적절한 이유는 무엇입니까?

I (select를 사용하여) 서버에 대한 비동기 TCP 소켓을 사용하고, 나는 또한 패킷이 그들이 파견 한 다음 select이 내게 말할 때 전송되는 순서로 대기됩니다 ​​"송신 큐"를 유지 소켓이 쓰기 가능합니다.

(참고 : 모든 "패킷"이 관련 소켓) 첫번째보기시

every 'networking' loop: 
    acquire sending queue mutex 

    for every writable socket acquired with select(): 
     for every packet in the sending queue: 
      if this packet is intended to be sent with this writable socket: 
       send the packet 
       remove the packet from the sending queue 

    release sending queue mutex 

,이, 나를 위해 잘 보이지만

기본적으로, 그것은 다음과 같이 구성되어있다 내 전송 대기열이 이며, 그 외의 것으로는입니다.

항상 같은 순서이지만 올바른 순서는 아닙니다. 예를 들어, 서버는 클라이언트에 일부 Chat 패킷을 보내 서버에 소개합니다. 그러나

player.sendMessage("Welcome to Nanoxide's public server, " + player.getName() + "!") 
player.sendMessage("The server is version " + self.getServer().getVersion()) 
player.sendMessage("and it is running under " + str(int(psutil.cpu_percent())) + "% CPU load.") 
player.sendMessage("") 

self.getServer().broadcastMessage(player.getName() + " joined the game") 

, 항상이 순서에 도착 : 나는 같은 것을 할

This server is version <version> 
<blank line> 
Welcome to Nanoxide's public server, <playername>! 
<playername> joined the game 

(참고 : 난 단지 지금까지 하나 개의 연결이 테스트 한) 난 이 문제를 일으키는 원인이 확실하지 않습니다. 나는 threading.Lock을 사용하기 때문에 스레드 간섭 (때때로 sendingQueue가 하나 이상의 스레드에 의해 수정 될 수 있음)을 생각하지 않는다. 순서가 맞지 않는 순서가 항상 이다. 패킷을 넣었습니다.

의심되는 점이 있습니다.이 문제는이 질문의 시작 부분에서 설명한 "네트워킹"루프와 관련이 있습니다. 의도하지 않았기 때문에 가끔 패킷이 전송되지 않았기 때문일 수 있습니다. 지정된 패킷, 그리고 그것은 목록을 통해 구멍을 뚫고, 그것을 순서대로 밀어냅니다 ...?

내가 뭘 잘못하고 있다고 생각하니, 어떻게 해결하겠습니까? 글로벌 큐가 아닌 모든 소켓에 대한 큐?

+0

'sendMessage' 메소드를 볼 수 있습니까? – cnicutar

+1

코드를 좀 더주세요! [정확히 무엇을 대기열 컨테이너로 사용하고 있습니까?] – tomasz

답변

2

의사 코드를 기반으로 큐를 반복하면서 큐를 수정하는 것처럼 보입니다. 위험 할 수 있습니다. 예 :

>>> x = range(10) 
>>> for i in x: 
...  print i 
...  if i%2==0: 
...    x.remove(i) 
... 
0 
2 
4 
6 
8 

이 문제를 해결하기위한 한 가지 방법은 반복 가능 복사본을 만드는 것입니다. 예 :

>>> x = range(10) 
>>> for i in x[:]: 
...  print i 
...  if i%2==0: 
...    x.remove(i) 
... 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

+1 그리고 대답. 반복하는 동안 목록을 수정하는 것이 위험하다는 것을 깨닫지 못했습니다. 아주 작은 코드에서이 목록을 가져와 주셔서 감사합니다. 문제 해결됨. – Jishaxe

관련 문제