下面和大家分享一下tornado 如何实现异步处理
下面的程序只能支持多线程的异步处理方式,扩展性一般,如果,可以改进为进程的方式扩展性会好很多 :)
之所以使用tornado 是因为,tornado 性能比较乐观,
具体比较请看下面的文章:
http://programmingzen.com/2009/09/13/benchmarking-tornado-vs-twisted-web-vs-tornado-on-twisted/
Client 端代码
>>> import socket
>>> d = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> d.connect((HOST,PORT))
Server 端代码,需要Linux 服务器
#encoding = utf-8
import errno
import functools
import socket
import time
import os
import traceback
import memcache
from tornado import ioloop, iostream
from threading import Thread
from Queue import Queue
from config import *
streamDict = {}
streamRequests = {}
################################# Utils ###############################
def stream_add(stream,count):
"""
添加 Stream
"""
streamkey = str(stream)
streamDict[streamkey] = (stream,0)
streamRequests[streamkey] = Queue()
def stream_remove(streamkey,stream):
"""
删除 Stream
"""
try:
stream.close()
except:
pass
del streamDict[streamkey]
del streamRequests[streamkey]
################################# Response ###############################
class ClockResponse(Thread):
"""
定时处理请求接口
"""
def __init__ (self):
"""
初始化
"""
Thread.__init__(self)
self.flag = True
self.count = 0
def run(self):
"""
运行线程
"""
while self.flag:
#打印 LOG,N次/打印
ct = self.count % 10
if ct == 0:
print 'now connections:%s'%(len(streamDict))
self.count = ct + 1
#循环处理请求
for streamkey,(stream,num) in streamDict.items():
try:
#这里返回Response
queue = streamRequests[streamkey]
print "queue.get()",queue.get()
print "q.qsize()",queue.qsize()
stream.write('haha')
except:
streamDict[streamkey] = (stream,num+1)
#去死吧.......
if num>DEAD_VALUE:
stream_remove(streamkey,stream)
time.sleep(SLEEP_TIME)
def stop(self):
self.flag = False
################################# Request ###############################
class SocketRequest(object):
"""
Socket 请求
"""
def __init__(self, stream, address):
self.stream = stream
self.streamkey = str(stream)
self.address = address
#开始读取数据
self.stream.read_until("\r\n", self.on_request)
def on_request(self,data):
"""
接收处理请求
"""
#将数据加载到 Queue
print "on_request" , data
queue = streamRequests[self.streamkey]
queue.put(data)
#继续读取请求
self.stream.read_until("\r\n", self.on_request)
def connection_ready(sock, fd, events):
"""
启动 Connection 监听,处理程序
"""
while True:
try:
connection, address = sock.accept()
except socket.error, e:
if e[0] not in (errno.EWOULDBLOCK, errno.EAGAIN):
raise
return
#non-block
connection.setblocking(0)
stream = iostream.IOStream(connection)
#保存stream
stream_add(stream,0)
#接收Socket 请求
SocketRequest(stream,address)
if __name__ == '__main__':
#pidfile = open(os.path.join(settings.PROJECT_PATH,'tornadoServer.pid'),'w')
#pidfile.write(str(os.getpid()))
#pidfile.close()
#接收请求
clock = ClockResponse()
clock.start()
#定义Socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) #这里的0 dummy protocol for TCP
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(0)
sock.bind(("", SERVER_PORT))
sock.listen(9999)
#获得ioloop
io_loop = ioloop.IOLoop.instance()
callback = functools.partial(connection_ready, sock)
io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
#启动服务
try:
io_loop.start()
except KeyboardInterrupt:
io_loop.stop()
clock.stop()
print "exited cleanly"
TCP/IP module for linux 2.6 dummy版
1、概述
英文单词dummy是虚假的意思,dummy版的TCP/IP module就是实现一个虚假的传输层协议,该协议不能完成任何实际的网络通讯。它通过module自身提供的一个经过改造的环回网络设备驱动程序mylo,展示网络数据在TCP/IP协议栈中发送和接收的整个流程。其意义在于为后续的实际的STREAM, DGRAM, RAW的开发提供一个基本的程序框架,以及初步验证这个框架的可行性,同时也帮助更好的理解2.6内核中整个TCP/IP协议栈的实现原理。
2、编译与安装
dummy版的module与第一版相比较,在模块划分和Makefile上作了很多改进。当前初步按TCP/IP协议栈的层次结构分为五个模块,下面是整个源代码目录树的基本情况:
ipv4 顶层目录。
|
|--inet inet域,主要完成inet域最顶层的一些基本操作。
|
|--application 应用层,现在主要为一个dummy协议的测试应用程序。
|
|--transport 传输层,目前只有一个dummy协议。
|
|--network 网络层。
|
|--datalink 数据链路层,目前只实现了环回网络设备驱动程序mylo。
|
|--core 核心模块,连接数据链路层和网络层,传递它们之间的数据。
|
|--include 头文件
|
|--load.sh unload.sh 装载和卸载脚本
|
|--Makfile env.mk makefile文件。
分享到:
相关推荐
Python与Java间Socket通信实例代码详解 Python与Java间Socket通信是指在Python和Java两个不同的语言平台之间实现数据交换和通信的过程。Socket是Python和Java中都支持的网络通信机制,可以实现跨语言平台的通信。 ...
在Python编程中,Socket是网络通信的基本模块,用于实现不同计算机之间的数据传输。本文将深入讲解如何使用Python的Socket库来传输大文件。文件传输在许多应用中都是必不可少的,例如分布式系统、文件共享和备份等。...
【Python聊天室 (socket tkinter)】是一个基于Python编程语言实现的简单聊天应用程序,它结合了socket库进行网络通信,tkinter库创建图形用户界面(GUI),以及threading库实现多线程来同步处理用户交互和网络活动。...
Python中的socket库是进行网络通信的基本工具,它允许程序员创建客户端和服务器端应用程序,实现不同设备间的网络数据传输。在“socket+python_python_socket”这个主题中,我们主要探讨的是如何利用Python的socket...
本项目" Dos.rar_nine44k_python_python socket_python socket聊天_python聊天室"正是基于Python的socket模块实现的一个多人在线聊天室,让我们来深入探讨这个话题。 首先,我们要理解什么是Python的socket。Socket...
Python提供了socket模块,可以非常方便的进行socket编程。 创建一个server socket 使用socket方法创建一个新的socket,通常提供两个参数,第一个参数是address family, 第二个是socket type。 #create an INET, ...
### 基于Python的Socket实现单机五子棋到双人对战 #### 概述 本文将详细介绍如何利用Python中的socket库实现一个简单的五子棋游戏,并将其从单机版扩展为支持两人在线对战的版本。通过这个过程,我们将学习到Python...
Python中的WebSocket和Socket是两种在网络通信中常用的协议,它们在实时数据传输,特别是构建实时交互应用(如在线聊天、股票行情、游戏等)时扮演着重要角色。在本主题中,我们将深入探讨“python-websocket-socket...
Python的socket模块是网络编程的基础,它提供了低级的、原始的TCP/IP和UDP套接字接口。在本文中,我们将深入探讨Python中socket的基本用法、如何创建服务器和客户端,以及涉及的一些重要概念。 首先,理解socket的...
资源内容:基于Socket的聊天室Python实现(GUI版) 使用/学习目标:了解 Socket 核心原理 特点:简单、带GUI方便使用 适用人群:想阅读Python源码的初学者,想自己搭建远程聊天室的站长们 可以参考本资源来搭建属于...
根据提供的标题、描述以及部分内容,本文将围绕Python中的网络编程技术进行深入探讨,重点解析socket模块及相关的高级网络处理库的使用方法与示例。在Python标准库中,socket是进行网络通信的基础,通过它我们可以...
在Python 3.6中,Socket编程是一种基础的网络通信技术,它允许程序之间通过网络进行数据交换。在这个场景中,我们关注的是如何利用Socket库来实现TCP协议下的视频传输。TCP(Transmission Control Protocol)是一种...
Python网络编程教程主要介绍如何使用Python语言开发基于socket的网络应用程序,通过本教程的学习,初学者可以掌握Python在网络编程方面的基础知识和高级特性。本教程采用的示例为聊天程序,旨在通过实例加深对Python...
### Python的Socket编程 在计算机网络中,socket(套接字)是一种用于进程间通信的机制,它允许不同计算机上的程序通过网络进行双向通信。本文将深入探讨如何使用Python进行socket编程,特别是创建一个简单的图形...
简单的python socket通信技术
Python的socket模块是进行网络通信的基础,它提供了一种低级别的、原始的TCP/IP套接字接口。在本示例中,“python-socket.zip”包含了一个实现简单天气查询和电话归属地查询的服务端与客户端应用。这个应用展示了...
本主题将深入探讨“基于Python的socket网络编程”,特别是结合Flask框架来搭建能够传输多种类型数据(如文本、图像、音频等)的网站。 首先,让我们了解基础的socket编程。在Python中,socket模块提供了低级的网络...
"python-handler-socket-0.2.1.tar.gz"是一个Python库的压缩包,它很可能包含了一个名为`handler_socket`的库,用于处理套接字(socket)相关的操作。 套接字是计算机网络编程中的基本概念,它提供了进程间通信...
Python异步Socket编程代码,对想学习python socket的人有用
在Python编程领域,Socket是用于网络通信的一种基础模块,它允许程序通过网络发送和接收数据。在这个项目中,我们利用Python的socket库构建了一个石头剪刀布(RPS,Rock-Paper-Scissors)游戏,同时结合了MySQL...