Python网络编程(子进程的创建与处理、简单群聊工具)
Unix/Linux操作系统提供了一个
fork()
系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是
fork()
调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回
0
,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用
getppid()
就可以拿到父进程的ID。Python的
os
模块封装了常见的系统调用,其中就包括fork
,可以在Python程序中轻松创建子进程
- 父进程创建子进程等待进程退出
- 子进程创建下一个进程,然后立即退出
- 二级子进程成为孤儿进程 处理具体工作
1.需要 将要做的事情封装 为函数2.使用multiprocessing提供的 process 创建进程对象3.通过进程对象和process初始化进程进行 进程的设置, 绑定函数4. 启动进程,会 自动执行绑定的函数5 .完成进程的回收
- 使用multiprocessing创建进程子进程同样复制父进程的全部内存空间
- 之后有自己的独立空间 执行上互不干扰 子进程也有自己的PID特有资源等
- 使用multiprocessing创建子进程,一般父进程功能就是创建子进程
- 回收子进程,返回事件交给子进程完成
from socket import * import os, sys # 发送管理员消息 def do_child(s, addr): while True: msg = input("管理员消息:") msg = "C 管理员 " + msg s.sendto(msg.encode(), addr) # 用户登录 def do_login(s, user, name, addr): if (name in user) or name == "管理员": s.sendto("该用户已存在".encode(), addr) return s.sendto(b'OK', addr) # 通知所有人 msg = "\n欢迎 %s 进入聊天室" % name for i in user: s.sendto(msg.encode(), user[i]) # 插入user user[name] = addr def do_chat(s, user, name, data): msg = "\n{} 说: {}".format(name, data) for i in user: if i != name: s.sendto(msg.encode(), user[i]) def do_quit(s, user, name): msg = "\n%s 离开了聊天室" % name for i in user: if i == name: s.sendto(b'EXIT', user[i]) else: s.sendto(msg.encode(), user[i]) del user[name] # 删除离开的用户 # 接收客户端请求并处理 def do_parent(s): # 用于存储用户 {'Alex':('127.0.0.1',8888)} user = {} while True: msg, addr = s.recvfrom(1024) msgList = msg.decode().split(' ') if msgList[0] == 'L': do_login(s, user, msgList[1], addr) elif msgList[0] == 'C': # "C Levi [I miss you]" data = ' '.join(msgList[2:]) do_chat(s, user, msgList[1], data) elif msgList[0] == 'Q': do_quit(s, user, msgList[1]) # 创建套接字,网络连接,创建父子进程 def main(): # server address ADDR = ('0.0.0.0', 8888) # 创建套接字 s = socket(AF_INET, SOCK_DGRAM) s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) s.bind(ADDR) # 创建父子进程 pid = os.fork() if pid < 0: sys.exit("创建进程失败") elif pid == 0: do_child(s, ADDR) else: do_parent(s) if __name__ == "__main__": main()
from socket import * import sys, os def login(s, ADDR): while True: name = input("请输入用户名:") msg = "L " + name s.sendto(msg.encode(), ADDR) # 接收登录结果 data, addr = s.recvfrom(1024) if data.decode() == 'OK': print("@进入聊天室@") return name else: print(data.decode()) # 发送消息 def do_child(s, name, addr): while True: text = input("发言(quit退出):") # 退出 if text.strip() == "quit": msg = "Q " + name s.sendto(msg.encode(), addr) sys.exit("退出聊天室") msg = "C %s %s" % (name, text) s.sendto(msg.encode(), addr) # 接收消息 def do_parent(s): while True: msg, addr = s.recvfrom(1024) if msg.decode() == 'EXIT': sys.exit(0) print(msg.decode() + "\n发言(quit退出):",end="") # main控制套接字的创建 def main(): if len(sys.argv) < 3: print("argv is error") return HOST = sys.argv[1] PORT = int(sys.argv[2]) ADDR = (HOST, PORT) s = socket(AF_INET, SOCK_DGRAM) name = login(s, ADDR) if name: pid = os.fork() if pid < 0: sys.exit("创建子进程失败") elif pid == 0: do_child(s, name, ADDR) else: do_parent(s) else: return if __name__ == "__main__": main()
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java源码-AtomicReference
开篇 The AtomicReference class provides reference objects that may be read and written atomically, so when multiple threads try to reach them at the same time, only one will be able to do so. 换句话说就是AtomicReference提供Object对象的原子类操作,提供了更加灵活的操作。 AtomicReference类和构造器 AtomicReference的构造函数类构造器有两个: 无参构造函数采用默认值初始化为0 有参数构造函数直接用initialValue来value的 AtomicReference类变量需要注意的两个点: AtomicReference的关键逻辑在于static代码快中通过unsafe接口初始化value的内存地址,后续直接通过内存地址进行操作。 AtomicReference的value是用volatile进行修饰保证变量的可见性 public class At...
- 下一篇
PHP项目学习1
最近在学习PHP,看了《轻松学PHP》,2天看完,学习了很多基础知识,可是没有出什么成果。然后看《PHP项目开发全程实录》,里面讲到一个online影视365网,刚好有一个朋友也要使用PHP做一个视频类的网站,所以我就用这个项目来练练。 主要内容: 架构 前言 开发背景 需求分析 系统分析 系统目标 系统的功能结构 架构 online影视365网,Apache+PHP+adodb+phpMyAdmin+MySQL实现。 前言 在全球知识经济和信息化高速发展的今天,网络化是企业发展的趋势,21世纪的人更习惯在网站上听音乐、看电影,所以企业要在同领域中得到突飞猛进的发展,就必须借助网络。 当今社会进入一个信息快速发展的社会,在网络世界浏览信息的同时,也可以听听歌曲,这样既愉悦了身心,有得到了最新的市场动态,由此网络上也出现了很多的影视网站,都很受到欢迎。未来视听生活的新空间,也必然在宽带互联网上开启。VOD(视频点播)的概念已经被越来越多的人接受,逐渐成为网络发展的必然趋势之一。 开发背景 xxx影视有限公司是一家以影视为主的公司。为了扩大企业规模,增强企业竞争力,决定向多元化发展,计算机...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品