文中科学研究的主要是Python程序编写scoketServer完成多线程同歩的相关内容,实际详细介绍以下。

开发设计全过程中,为了更好地完成不一样的客户端同一時刻只有有一个应用相互数据

虽然用Python撰写简易的互联网程序流程很便捷,但繁杂一点的互联网程序流程還是用现有的架构比较好。那样就可以专心致志事务管理逻辑性,而不是套接字的各种各样关键点。SocketServer控制模块简单化了撰写互联网系统服务的每日任务。另外SocketServer控制模块也是Python标准库中许多网络服务器架构的基本。

互联网服务类:

SocketServer出示了4个基础的服务项目类:

TCPServer对于TCP套接字流
UDPServer对于UDP数据报套接字
UnixStreamServer和UnixDatagramServer对于UNIX域套接字,不常见。

最先,确立一点,在scoketServer中,每每有一个客户端联接取得成功后都是会为每一个客户端建立一个线程。

为了更好地让这种多线程中间可以同歩实行,我的做法是:再建立一个线程类,这一线程类中做一些我的新项目必须做的事儿,,当某一客户端想成应用到这一线程时,给当今线程上锁,运作进行后释放出来锁。

请指教

详尽流程可以看注解:

#coding=gbk
__author__ = 'kaikai'

import Queue
import threading
import time
import SocketServer

#全局线程锁
threadLock = threading.Lock()#全局数据队列
data = Queue.Queue()
#工作中线程类,
class testThead(threading.Thread):
  global data
 def __init__(self):
    threading.Thread.__init__(self)

  def begin_test(self):
    self.start()

  def run(self):
    global threadLock
    threadLock.acquire()

    # 从队列中取下联接和数据
    if data.qsize()>0:
      this_receive = data.get()
    else:
      print "data size is empty !"
      return

    # 分析数据,得到联接和数据
    # 应用当今数据的conn
    this_conn = this_receive.keys()[0]
    this_data = this_receive[this_conn]

    # 释放出来锁
    threadLock.release()

  def send_msg(self,conn,msg):
    try:
      conn.sendall(msg)
    except Exception as e:
      print "send "   str(msg)  "fail !!!!!!!!!!!!!!"

  def recv_msg(self,conn):
    try:
      recv_msg = conn.recv(2048)
      return recv_msg
    except Exception as e:

      print " recv msg fail !!!!!!!!!!"
      return None

# 每有一个客户端转化成一个线程。全部线程启用同一个检测线程,假如检测线程在锁住中,则进到等候。
class MyServer(SocketServer.BaseRequestHandler):

  def send_msg(self,conn,msg):
    try:
      conn.sendall(msg)
    except Exception as e:
      print "send "   str(msg)  "fail !!!!!!!!!!!!!!"
  def recv_msg(self,conn):
    try:
      recv_msg = conn.recv(2048)
      return recv_msg
    except Exception as e:

      print " recv msg fail !!!!!!!!!!"

  def handle(self):
    global data
    # 得到联接
    conn = self.request

    print "client connect!"

    # 循环系统接纳客户端数据
    while True:
      # 接纳客户端推送回来的主要参数
      receive_data = self.recv_msg(conn)

      print receive_data
      # 假如主要参数为空,回到出错 完毕循环系统
      if not receive_data:
        print "can not get data form client ! "
        break

      print "data size put before: "   str(data.qsize())
      # 将联接和数据加上到队列中 放进联接能够 确保在另一个线程中立即应用联接给相对客户端推送或是接纳数据。另外确保数据与客户端的一一对应
      data.put({conn:receive_data})

      print "data size put aftter: "   str(data.qsize())
      # 复位检测线程
      testThead_this = testThead()
      # 刚开始检测线程
      testThead_this.begin_test()
      # testThead_this.start()
      # 等候检测线程实行完毕
      testThead_this.join()

      print "this test end "

if __name__ == "__main__" :
  try:
    server = SocketServer.ThreadingTCPServer(('192.168.100.100',56780),MyServer)
    server.timeout = 100
    print "Server run success !!!! "

    server.serve_forever()

  except Exception as e:
    print "Server run failed !!!!\n  error: "   str(e)

小结

之上便是文中有关Python程序编写scoketServer完成多线程同歩案例编码的所有内容,期待对大伙儿有一定的协助。很感兴趣的盆友能够 再次参考本网站别的有关专题讲座,若有存在的不足,热烈欢迎留言板留言强调。感恩朋友们对本网站的适用!