应用中学习python多线程和socket编程
def run(self): global query_lock,query_list,server_list,server_pos,server_max while True: if query_lock.acquire(): try: query = query_list.pop(0) #轮询服务器 ip,port = server_list[server_pos] server_pos = server_pos + 1 if server_pos == server_max: server_pos = 0 except IndexError: query_lock.release() break; query_lock.release() sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.connect((ip,port)) sock.send(query) res = sock.recv(1024) sock.close() print res.replace('\n','')
?
服务器端server.py:
path_dir = sys.path[0]sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind((socket.gethostbyname(socket.gethostname()),9710))sock.listen(10)while True: connection,address = sock.accept() try: connection.settimeout(60) line = connection.recv(1024) arrs = line.split() if len(arrs) == 2: table = arrs[0] url = arrs[1] cmd = "sh " + path_dir + "/seek_hst.sh " + table + " " + url sub_p = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT); result = ""; buff = ""; while True: buff = sub_p.stdout.readline(); result += buff; if buff == '': break; result = result.replace('\n',''); connection.send(result); else: connection.send('please go out!') except socket.timeout: print 'time out' connection.close()?
这是目前的简略版,写起来后各种不同的想法涌现出来,目前想到可以改进的地方:
1. client端连接服务器及端口的配置动态化
2. 可控的超时控制,进一步设计在socket连接上构建自己的协议包内容
3. 服务器端的多线程处理,select及epoll方式的异步IO
?