2012-10-05 69 views
0

如何解決這個錯誤?我想通過get_robotxya()和get_ballxya() 的值並在循環中使用它,但似乎它會在一段時間後崩潰,我該如何解決這個問題?我想它內部消除了崩潰while循環崩潰在一個while循環python

import socket 
import os,sys 
import time 
from threading import Thread 

HOST = '59.191.193.59' 
PORT = 5555 

COORDINATES = [] 

def connect(): 
    globals()['client_socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client_socket.connect((HOST,PORT)) 

def update_coordinates(): 
    connect() 
    screen_width = 0 
    screen_height = 0 
    while True: 
     try: 
      client_socket.send("loc\n") 
      data = client_socket.recv(8192) 
     except: 
      connect(); 
      continue; 

     globals()['COORDINATES'] = data.split() 

     if(not(COORDINATES[-1] == "eom" and COORDINATES[0] == "start")): 
      continue 

     if (screen_width != int(COORDINATES[2])): 
      screen_width = int(COORDINATES[2]) 
      screen_height = int(COORDINATES[3]) 
      return 

def get_ballxy(): 
    update_coordinates() 
    ballx = int(COORDINATES[8]) 
    bally = int(COORDINATES[9]) 

    return ballx,bally 

def get_robotxya(): 
    update_coordinates() 
    robotx = int(COORDINATES[12]) 
    roboty = int(COORDINATES[13]) 
    angle = int(COORDINATES[14]) 
    return robotx,roboty,angle 

def print_ballxy(bx,by): 

    print bx 
    print by 

def print_robotxya(rx,ry,a): 

    print rx 
    print ry 
    print a 

def activate(): 

    bx,by = get_ballxy() 
    rx,ry,a = get_robotxya() 
    print_ballxy(bx,by) 
    print_robotxya(rx,ry,a) 


Thread(target=update_coordinates).start() 
while True: 
    activate() 

這個值是錯誤我得到: enter image description here

+0

您正在建立太多的連接......當您完成這些連接時,您需要關閉它們...... –

+0

修復請格式化,您擁有的將不會編譯。由於代碼中有選項卡,因此格式化會受到限制(請參閱PEP8)。 – paxdiablo

+0

沒關係,我已將其修改爲我認爲它有意義,請檢查並通知 – paxdiablo

回答

2

我想你會發現,因爲你不斷地創造新的連接沒有關閉它們,你最終會耗盡資源。

這可能是一個局部限制,或者它可能是服務器端受夠了來自單個IP的太多連接。

無論是創建一個連接並反覆使用它,還是在完成連接後關閉連接。這樣做的


一種可能的方式是將主代碼中connect()調用activate()前:

connect() 
update_coordinates() 
while True: 
    activate() 

然後從update_coordinates()功能開始刪除初始connect()因爲那是,做了位每次嘗試更新座標時新的連接。

如果會話由於某種原因而關閉,except位會重新創建並重試。

這應該有希望緩解您的資源問題。

+0

哈哈,我同時發佈了同樣的東西作爲評論:)好的答案...我認爲 –

+0

@JoranBeasley你介意展示一個如何解決這個問題的例子?我有這方面的知識零連接的事情,因爲這是我的合作伙伴部分的項目 – Edward

+0

把'client_socket.close()'在可能返回之前.. –