一个简单的例子,深入研究一下socket的多线程处理任务

Server端:

#!/usr/bin/env python
#encoding:utf8
#
# 注意:定义encoding时必须在第二行 import socket
import Queue
import threading
from time import sleep host = "127.0.0.1"
port = 60283
timeWait = 3 #定义每个线程处理任务时需要的时间,模拟处理任务
ThreadNum = 10 #定义创建的线程 cache = Queue.Queue(maxsize=1000) #定义一个队列 # 处理任务的类
class Server(threading.Thread):
def __init__(self, cache, ThreadName):
threading.Thread.__init__(self)
self.name = ThreadName
self.cache = cache def run(self):
while True:
if not cache.empty(): #判断队列是否为空
conn, addr = cache.get()
data = conn.recv(1024)
conn.sendall('success')
print 'cacheData: ' + data + '; ThreadName: ' + self.name + '; cacheSize: ' + str(self.cache.qsize())
sleep(timeWait) for i in range(ThreadNum):
s = Server(cache, str(i))
s.setDaemon(True) #设置为守护模式,当主线程退出时,子线程立即退出
s.start() # 创建Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定socket
s.bind((host, port))
# 设置系统最大等待队列,当连接过多时,系统缓存中可以缓存多少连接,不宜设置过大,消耗内存和cpu
s.listen(5) while True:
# 循环接受,当接受到连接时,把连接放入队列中,由线程获取后执行
conn, addr = s.accept()
cache.put((conn, addr)) conn.close()

Client端:

#!/usr/bin/env python
# import socket
from time import sleep
from threading import Thread host = "127.0.0.1"
port = 60283
num = 100 def sirec(s, n):
s.sendall('sn:' + str(i))
data = s.recv(1024)
s.close() for i in range(1, 100):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
t = Thread(target=sirec, args=(s, 1))
#t.setDaemon(True)
t.start() print 'run over'

关于队列Queue的使用:

q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait() 相当q.get(False)
非阻塞 q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作

Python: Socket网络编程,多线程处理小Demo的更多相关文章

  1. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  2. Python Socket 网络编程 (客户端的编程)

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. Python Socket网络编程详解

    Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...

  4. 25 python socket网络编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  5. Python - Socket网络编程 - 第二十六天

    网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...

  6. python socket网络编程之粘包问题详解

    一,粘包问题详情 1,只有TCP有粘包现象,UDP永远不会粘包 你的程序实际上无权直接操作网卡的,你操作网卡都是通过操作系统给用户程序暴露出来的接口,那每次你的程序要给远程发数据时,其实是先把数据从用 ...

  7. python——socket网络编程

    一.OSI七层模型

  8. 初学Python——Socket网络编程

    认识socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递.我们知道网络 通信 都 是基于 ip+port(端口) 方能定位到目标的具体机 ...

  9. Python socket网络编程(通信介绍)

      socket通信介绍 通信介绍(一) 1.所有网络协议的基础就是:socket 2.socket对TCP与UDP协议封装,让用户进行简单操作. 3.socket只做两件事:发 send,收 rec ...

  10. Python Socket 网络编程 (服务器端编程)

    服务器端主要做以下工作: 打开 socket 绑定到特定的地址以及端口上 监听连接 建立连接 接收/发送数据 上面已经介绍了如何创建 socket 了,下面一步是绑定. 绑定 socket 函数 bi ...

随机推荐

  1. 选择排序&冒泡排序

    //直接选择排序 #include<stdio.h> void SelectionSort(int arr[],int len) { int i,j; int k,min; int tem ...

  2. matlab初级

    命令 ======== 系统命令 命令 功能 例 date 显示当前日期 ans = 20-Jul-2019 what 当前文件夹下的matlab文件   type 文件中的内容 type CV.m ...

  3. 第 10 章 gdb

    一.参考网址 1.linux c编程一站式学习 二.命令列表 1.图1: 2.图2: 3.图3: 三.重点摘抄 1.断点与观测点的区别 我们知道断点是当程序执行到某一代码行时中断,而观察点是当程序访问 ...

  4. P3252 [JLOI2012]树

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...

  5. 设计模式讲解2:static proxy和decorator的不同点

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 在常见的23种设计模式中,static proxy和decorator在代码结构上是特别相似的.那它们的不 ...

  6. 函数返回值return

    #函数后面如果没有return系统会默认return none def ff(): print("打印return") return 15 # 函数在执行中遇到return就会停止 ...

  7. 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...

  8. PAT Advanced 1078 Hashing (25) [Hash ⼆次⽅探查法]

    题目 The task of this problem is simple: insert a sequence of distinct positive integers into a hash t ...

  9. JIT Debug Info 简介

    原总结debug调试dump转储文件JITprocdumpJIT Debugging 前言 在上一篇介绍 JIT Debugging 的文章 -- 你需要了解的JIT Debugging 中,我们了解 ...

  10. 简单的tab栏切换

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...