Python学习笔记(六)多进程实现并发服务器

这个相对于多进程更加简单,每accept一个新的连接就创建一个新的线程。代码如下:

# coding: utf-8
import socket
import sys
import errno
import threading
from time import ctime

class ClientThread(threading.Thread):
    def __init__(self, client_socket, client_address):
        threading.Thread.__init__(self)
        self.client_socket = client_socket
        self.client_address = client_address

    def run(self):
        self.handle_connection()

    def handle_connection(self):
        while True:
            data = self.client_socket.recv(1024)
            if not data:
                print ‘disconnect‘, self.client_address
                self.client_socket.close()
                break;
            else:
                self.client_socket.send(‘[%s] %s‘ % (ctime(), data)) #回显消息

if __name__ == ‘__main__‘:
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    listen_address = (‘localhost‘, 9981)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind(listen_address)
    server_socket.listen(10)

    while True:
        try:
            (client_socket, client_address) = server_socket.accept()
        except IOError, e:
            if e.errno == errno.EINTR:
                continue #继续等待
            else:
                raise #将异常向外throw
        print ‘Got connection from ‘, client_address
        t = ClientThread(client_socket, client_address)
        t.start()

注意这里的thread不能进行join,否则会阻塞主线程,丧失并发能力。

另外,python中的线程不需要进行detach。

时间: 2024-08-03 23:49:14

Python学习笔记(六)多进程实现并发服务器的相关文章

python学习笔记(多进程并发)

理论篇: 1.什么是进程: 进程:计算机系统中正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 2.进程和程序的区别: 程序是实现功能的一堆代码,而进程是程序运行的过程. 注:同一个程序同时打开两次或多次,就会启动两个或多个进程. 3.并发与并行: 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 一 并发:是伪并行,即看起来是同时运行.单个cpu+多道技术就可以实现

Python学习笔记六:列表、元组、字典

学习其他语言很少关注数组是的结构是怎么回事,都是直接使用.Python定义了列表.元组.字典三种数据结构,是我们使用python的基础,因此有必要理解它们的含义,我想这个和python一切皆对象的思想有关.python的数据结构更加灵活. 1. 列表[lists] 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列都可以进行的操作包括索引,切片,加

python学习笔记(六):常用模块

一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包,package本质就是一个文件夹,和文件夹不一样的是它有一个__init__.py文件,包是从逻辑上来组织模块的,也就是说它是用来存放模块的,如果你想导入其他目录下的模块,那么这个目录必须是一个包才可以导入. 导入模块 1 2 3 4 5 import module #导入模块 from modul

Python学习笔记六(常用模块、面向对象基础)

一.random模块 import random print(random.random()) #0-1之间的小数 print(random.randint(1,5)) #1-5之间(包括1和5)的整数 print(random.randrange(1,5)) #1-5之间(包含1,不好包含5)的整数 print(random.choice(['a','b','c'])) #给定列表中任意元素 print(random.sample(['a','b','c','d'],2)) #给定列表中任意n

Python学习笔记六--文件和输入输出

6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. open()方法的语法: file_object=open(filename,access_mode,buffering) filename,表示要打开的文件名的字符串,可以是相对路径也可以是绝对路径. access_mode,表示打开方式.常见有'r'.'w'.'a',分别表示读模式,写模式,追加

python学习笔记六:字典

字典是python中唯一内建的映射类型. 特点: 没有特殊的顺序: 存储在特定的键(key)下,可以是数字.字符串甚至是元组 创建和使用字典 phonebook= {'Alice':'2341', 'Beth':'9102','Cecil':'3258'} a.由键-值组成,上述例子中,名字是键,电话号码是值 b.键与值用冒号(:)隔开 c.每一对键-值使用逗号(,)隔开 d.整个字典由一对大括号括起来 e.空字典:{} dict函数 >>> items = [('name','Gumb

Python学习笔记六:文件处理

一:打开文件 open(name,mode,[bufferSize]) name:文件路径 mode:文件打开方式 二:文件读取 read()方法:可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示. readline([size]):如果不传参,一次默认读取一行.如果size<一行长度,则读取size个字节.如果size>一行长度,则只读取一行. readlines():一次读取io.DEFAULT_BUFFER_SIZE行,约586行,以字符串数组的形式返回读取结

Python学习笔记(六)再谈Python模块

Python程序包含多个模块文件,一个主体.顶层文件实现主要控制流程.调用组件和工具,其他模块文件则提供组件和工具,python自带了许多实用的模块称为标准链接库.模块是python中最高级别的程序组织单元,将代码和数据封装起来以便重用.每一个文件都是一个模块,并且可以通过"导入"来使用其他模块的变量(顶层定义的所有变量).模块被导入时就生成了一个模块对象.从抽象的角度看,模块的作用有: 1)代码重用-模块文件的代码可以永久保存,可以被多个客户端使用.任意的重新运行和重载 2)划分系统

python学习笔记——multiprocess 多进程组件Pool

1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成多个进程,几十个尚可,若上百个甚至更多时,手动限制进程数量就显得特别繁琐,此时进程池就显得尤为重要. 进程池Pool类可以提供指定数量的进程供用户调用,当有新的请求提交至Pool中时,若进程池尚未满,就会创建一个新的进程来执行请求:若进程池中的进程数已经达到规定的最大数量,则该请求就会等待,直到进程

python学习笔记六之模块下(基础篇)

shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb") >>> s['x'] = ['a','b','c'] >>> s['x'].append('d') >>> s['x'] ['a', 'b', 'c'] 解析:当你在shelve对象中查找元素的时候,这个对象都会根据已经存储的版本进行重新构建,当你将