파이썬 백엔드 서버가있는 멀티 플레이어 플래시 게임을하고 있는데, 서버에 문제가 있습니다.내 목록이 일관되게 부적절한 이유는 무엇입니까?
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가 하나 이상의 스레드에 의해 수정 될 수 있음)을 생각하지 않는다. 순서가 맞지 않는 순서가 항상 이다. 패킷을 넣었습니다.
의심되는 점이 있습니다.이 문제는이 질문의 시작 부분에서 설명한 "네트워킹"루프와 관련이 있습니다. 의도하지 않았기 때문에 가끔 패킷이 전송되지 않았기 때문일 수 있습니다. 지정된 패킷, 그리고 그것은 목록을 통해 구멍을 뚫고, 그것을 순서대로 밀어냅니다 ...?
내가 뭘 잘못하고 있다고 생각하니, 어떻게 해결하겠습니까? 글로벌 큐가 아닌 모든 소켓에 대한 큐?
'sendMessage' 메소드를 볼 수 있습니까? – cnicutar
코드를 좀 더주세요! [정확히 무엇을 대기열 컨테이너로 사용하고 있습니까?] – tomasz