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函数,因为该函数会使得进程阻塞,这样不具备并发能力。
Python学习笔记(五)多进程实现并发服务器的更多相关文章
- python学习笔记——multiprocessing 多进程组件 Pipe管道
进程间通信(IPC InterProcess Communication)是值在不同进程间传播或交换信息. IPC通过有管道(无名管道 和 有名 / 命名管道).消息队列.共享存储 / 内容.信号量. ...
- python学习笔记五 模块下(基础篇)
shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...
- python学习笔记五 模块上(基础篇)
模块学习 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- Python学习笔记五
一. 递归 递归函数: def a (): print ("from b") b() def b(): print("from a ") a() a() 递推和 ...
- Python学习笔记五:错误与异常
一:常见异常与错误 BaseException 所有异常的基类SystemExit 解释器请求退出KeyboardInterrupt 用户中断执行(通常是输入^C)Exception 常规错误的基类S ...
- python学习笔记——multiprocessing 多进程组件-队列Queue
1 消息队列 1.1 基本语法 消息队列:multiprocessing.Queue,Queue是对进程安全的队列,可以使用Queue实现对进程之间的数据传输:还有一个重要作用是作为缓存使用. Que ...
- python学习笔记——multiprocessing 多进程组件 进程池Pool
1 进程池Pool基本概述 在使用Python进行系统管理时,特别是同时操作多个文件目录或者远程控制多台主机,并行操作可以节约大量时间,如果操作的对象数目不大时,还可以直接适用Process类动态生成 ...
- python学习笔记——multiprocessing 多进程模块Process
系统自带的fork模块创建的多进程是基于Linux或Unix平台的,而window平台并不支持: python中的multiprocess为跨平台版本的多进程模块,支持子进程.通信和共享数据.执行不同 ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- Python学习笔记五(读取提取写入文件)
#Python打开读取一个文件内容,然后写入一个新的文件中,并对某些字段进行提取,写入新的字段的脚本,与大家共同学习. import os import re def get_filelist(dir ...
随机推荐
- 使用 .NET Core 的日志记录
如何使用 Microsoft.Extensions.Logging public static void Main(string[] args = null) { ILoggerFactory ...
- PHP文件环境搭建—EcShop环境搭建
1 rpm -qa|grep yum|xargs rpm -e --nodeps 2 ls 3 rpm -ivh python-iniparse-0.3.1-2.1.el6.noar ...
- Django-ContentType
背景:学位课.专题课.价格策略(每一种课程(学位课和专题课下可分为不同的种类的课程)在不同学习时间内的价格不同) 例如:如何将课程表与价格策略表关联起来: 用外键是可以将课程表和价格策略表关联起来的, ...
- UTF-8编码中BOM的检测与删除[linux下命令]
Posted on 2011-05-14 所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此 ...
- C#汉字转十六进制
public class chsHex{/// <summary>/// 从汉字转换到16进制/// </summary>/// <param name="s& ...
- linux中MySQL本地可以连接,远程连接不上问题
1.网络或防火墙问题 (1)检查网络直接ping你的远程服务器,ping 182.61.22.107,可以ping通说明网络没问题 (2)看端口号3306是不是被防火墙挡住了,telnet 182.6 ...
- 暴力 【p4092】[HEOI2016/TJOI2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作: 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其 ...
- 6、Flask实战第6天:视图函数Response返回值
视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下: 如果返回的是一个合法的响应对象,则直接返回 可以使用make_response函数来创建Response对象,这个方法可以设置额 ...
- sqlplus terminators - Semicolumn (;), slash (/) and a blank line
The problem here is the way SQL*Plus interprets the commands passed to it. Remember the "SQL co ...
- JVM的参数配置
JVM管理的内存叫堆.在32Bit操作系统上有1.5G-2G的限制,而64Bit的就没有. JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G. JVM最大分配的内存由-Xmx指定 ...