本文研究的主要是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实现多线程同步实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

标签:
python,scoketserver,python,多线程,server,python,多线程实例,python,多线程

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?