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

 

每创建一个TCP连接,就创建一个进程。

代码如下:

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

def hanlde_sigchld(a, b):
    (pid, status) = os.wait()
    print ‘Child %d Finish, status = %d‘ % (pid, status)

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

if __name__ == ‘__main__‘:
    signal.signal(signal.SIGCHLD, hanlde_sigchld) #安装SIGCHLD的处理函数

    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
        pid = os.fork()
        if pid == 0:
            server_socket.close()
            handle_connection(client_socket, client_address)
            sys.exit(0)    #防止子进程中忘记exit
        elif pid > 0:
            client_socket.close() #必须关闭

这里有几点需要注意:

1.子进程中需要关闭server套接字,因为子进程只需要客户套接字即可。

2.父进程必须关闭客户套接字,因为该socket是基于引用计数的,父进程不关闭,会导致该套接字永远不会真正的关闭。

3.注意处理子进程的消亡,避免僵尸进程。这里不能直接使用wait或者waitpid函数,因为该函数会使得进程阻塞,这样不具备并发能力。

时间: 2024-10-08 11:13:26

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

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

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

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰

Python学习笔记五(模块与包)

一.模块 1.模块介绍 一个模块就是包含了一组功能的python文件,可以通过import导入模块使用. python中模块分为四个类别: a) 使用python编写的.py文件 b) 已被编译为共享库或DLL的C或C++扩展 c) 把一系列模块组织到一起的文件夹,文件夹内有__init__.py文件,称该文件夹为包 d) 使用C编写并链接到python解释器的内置模块 定义my_module.py模块,模块名为my_module print("from my_module.py")

Python学习笔记五_数据类型(字符串)

已经学习过的数据类型包括:int.float.list.tuple.dict.这篇来单独记录下字符串.单独将字符串这种数据类型写出来,是因为python里有很多非常有用的字符串内置方法. 一.字符串定义 字符串可以存任意类型的字符串,比如名字,一句话等等. 1 name = 'Rebecca' 2 msg = 'Fighting' 二.字符串内置方法 1.常用方法 输出为字符串的方法 a = 'my name is Rebecca' print(a.capitalize()) #将字符串的第一个

Python学习笔记五:数字和字符串

数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. Python数字类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中的有效Python表达式,并返回一个对象 tupl

Python学习笔记五--条件和循环

5.1 if语句 没什么好说,if语句语法如下: if expression: expr_true_suit 5.1.1多重条件表达式 单个if语句可以通过布尔操作符and,or,not实现多重条件判断或否定判断. if not warn and (system_load>=10): print 'WARNING:LOSING RESOURCE' warn+=1 5.2 else 语句 如果if条件为假程序将执行else后的语句. if expression: expr_true_suit el

python学习笔记(五) - 模块

一. 使用模块 引入sys模块,使用import #!/usr/bin/env python # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print 'Hello, world!' elif len(args)==2: print 'Hello, %s!' % args[1] else: p

python学习笔记五:字符串方法

常用字符串常量: string.digits:包含数字0~9的字符串 string.letters:包含所有字母(大写或小写字符串,在python3.0中,使用string.ascii-letters代替) string.lowercase:包含所有小写字母的字符串 string.printable:包含所有可打印字符的字符串 string.punctuation:包含所有标点的字符串 string.uppercase:包含所有大写字母的字符串 1)find:在较长的字符串中查找子串,返回子串所

python学习笔记(五) 200行实现2048小游戏

用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏. 先将用户操作和游戏逻辑绑定. WASD分别对应移动方向上.左.下.右 然后实现矩阵的转置和逆置,这样只要实现一个方向的移动,通过转置和逆置就可以得到其他方向 的移动. 基本的函数声明完成了,下面定义GameField类,主要实现游戏逻辑和状态转换. GameField类和其中包含的一些函数.先看构造函数. 构造棋盘并且刷新棋盘,作为初次游戏的布局. spawn函数为随机某个位置设置随机值. 移动函数,这个函数比较复杂,代

Python学习笔记五,函数及其参数

在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容 交互模式下编写函数完毕按两次回车返回>>> pass作为函数为空函数的占位符(她的意思是什么都不做),也就是说没想好写什么函数,先用pass占位,然后先让程序跑起来: 数据类型检查可以用内置函数isinstance(object,calssinfo)实现:如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True.如果object不是一个给定类型的的对