通过 fork 创建子进程的方式可以实现父子进程监听相同的端口。

方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程,达到监听同一个端口的目的。

# 代码示例:一主一子

import socket

import select

import sys

import struct

import os

import time

if __name__ == '__main__':

pid = os.getpid()

s1 = socket.socket() # 创建 socket 对象

# host = socket.gethostname() # 获取本地主机名

host = '127.0.0.1'

port1 = 12346 # 设置端口号

# port2 = 12347

# --关键代码--

s1.bind((host, port1))

pid1 = os.fork()

print("我会被主子进程分别执行一次")

# 也可以分别写到分子进程里

s1.listen(5)

# --关键代码--

while True:

if pid1 == 0:

# s1.listen(5)

print("子进程")

socket1, addr1 = s1.accept()

print(addr1)

socket1.send("子进程响应".encode('utf-8'))

socket1.close()

print('结束服务端子进程')

else:

# s1.listen(5)

print("主进程")

socket2, addr2=s1.accept()

print(addr2)

socket2.send("主进程响应".encode('utf-8'))

socket2.close()

print('结束服务端主进程')

# 代码示例:一主多子

import socket

import select

import sys

import struct

import os

import time

if __name__ == '__main__':

pid = os.getpid()

s1 = socket.socket() # 创建 socket 对象

# host = socket.gethostname() # 获取本地主机名

host = '127.0.0.1'

port1 = 12346 # 设置端口号

# port2 = 12347

s1.bind((host, port1))

pid1 = os.fork()

# s1.listen(5)

print("我会被主子进程分别执行一次")

while True:

if pid1 == 0:

s1.listen(5)

print("子进程1")

socket1, addr1 = s1.accept()

print(addr1)

socket1.send("子进程响应1".encode('utf-8'))

socket1.close()

print('结束服务端子进程1')

elif pid1 != 0:

pid2 = os.fork()

if pid2 == 0:

s1.listen(5)

print("子进程2")

socket2, addr2 = s1.accept()

print(addr2)

socket2.send("子进程响应2".encode('utf-8'))

socket2.close()

print('结束服务端子进程2')

else:

s1.listen(5)

print("主进程")

socket2, addr2 = s1.accept()

print(addr2)

socket2.send("主进程响应".encode('utf-8'))

socket2.close()

print('结束服务端主进程')

# 试想下子进程还有子进程的写法和用法

惊群现象

当连接到来时,子进程、父进程都可以 accept, 这就是著名的“惊群”问题(thundering herd problem)。

应用多进程多线程模型

一直疑惑一个应用app如何才能以多进程,多线程的方式运行。对于多线程可能很好理解,我们只要在进程中启用多线程的模式即可。也就是来一个请求,我们就用函数pthread_create()启用一个线程即可。这样我们的应用就可以在单进程,多线程的模式下工作。

一个应用app通常工作在多进程,多线程的模式下,它的效率是最高的。那么我们如何才能做到多进程模式呢?经验告诉我们,如果多次启动一个进程会报错:“Address already in use!"。这是由于bind函数导致的,由于该端口号已经被监听了。

fork原理

fork时,子进程复制一份父进程的资源。然后父子进程分别执行os.fork()之后的程序

子进程中fork函数返回0,父进程中返回子进程的pid

Python的os.fork()是一个会返回两次的函数

通过linux内核的SO_REUSEPORT选项实现多个进程监听相同的端口

# reuseport.py代码

import socket

import os

#xiaorui.cc

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

s.bind(('0.0.0.0', 1234))

s.listen(1)

while True:

conn, addr = s.accept()

print('Connected to {}'.format(os.getpid()))

data = conn.recv(1024)

conn.send(data)

conn.send(str(os.getpid()))

conn.close()

# 启动多个进程

nohup python reuseport.py &

nohup python reuseport.py &

nohup python reuseport.py &

# 使用nc测试,可以得到随机的一个进程响应

echo "xiaorui" | nc localhost 1234

# 使用socat(nc的增强版)测试,可以得到随机的一个进程响应

echo "ss" | socat - tcp-connect:localhost:1234

linux 系统下开机自动启动oracle 监听和实例 (亲测有效)

[oracle@oracle11g ~]$ dbstartORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listene ...

linux: 获取监听指定端口的进程PID

在 linux 下经常需要杀死(重启)监听某端口的进程, 因此就写了一个小脚本, 通过 ss 命令获取监听制定端口的进程 PID, 然后通过 kill 命令结束掉进程: #!/bin/sh # set ...

[Linux] 多进程网络编程监听一个端口

SO_REUSEPORT支持多个进程或者线程绑定到同一端口 每个进程可以自己创建socket.bind.listen.accept相同的地址和端口,各自是独立平等的.让多进程监听同一个端口,各个进程中 ...

linux系统中,查看当前系统中,都在监听哪些端口

需求描述: 查看当前系统中都监听着哪些的端口,用netstat命令,在此记录下 操作过程: 1.查看系统中都在监听哪些端口 [root@testvm home]# netstat -ntl Activ ...

Linux中安装Oracle11g后出现监听的问题及解决办法

软件安装: 参考文章: linux安装Oracle11G 错误如下: [oracle@iz2f570bi1k56uz admin]$ lsnrctl start LSNRCTL for Linux: ...

Linux下启动Oracle服务和监听程序步骤

Linux下启动Oracle服务和监听程序启动和关闭步骤整理如下: 1.安装oracle: 2.创建oracle系统用户: 3./home/oracle下面的.bash_profile添加几个环境变量 ...

Linux下的启动oracle服务 启动监听 开放端口操作

尝试登录oracle 使用root用户将没有sqlplus命令 [root@localhost ~]# sqlplus /nolog bash: sqlplus: 未找到命令...     [root ...

获取Windows下某进程监听的TCP/UDP端口

1.在Windows下用CMD netstat命令可以获得当前进程监听端口号的信息,如netstat -ano可以看到IP.port.状态和监听的PID. 那么可以执行CMD这个进程得到监听的端口号信 ...

Linux 使用NC命令永久监听本地端口

感谢: 冰点阳光 Linux可以使用nc命令来测试网络端口是否正常,类似于telnet命令,但也可以用nc命令来监听本地端口,支持TCP.UDP协议,当我们测试NTP服务网络策略是否正常时,可以使用到 ...

随机推荐

NOIP 考前 数论复习

POJ 2891 x=r1 (mod a1) x=r2 (mod a2) x=a1*x+r1,x=a2*y+r2; a1*x-a2*y=r2-r1; 用Extend_Gcd求出m1*x+m2*y=d; ...

mysql数据库字符集的设置

my.ini文件中clinet和mysqld中的写法不一样,要注意  [client]   port=3306   default-character-set=utf8      [mysqld]   ...

csuoj 1503: 点到圆弧的距离

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 1503: 点到圆弧的距离 时间限制: 1 Sec  内存限制: 128 MB  Speci ...

(1)java虚拟机概念和结构图

java虚拟机解构图一 java虚拟机解构图二 java虚拟机结构图三 [1]类加载系统        --->负责从文件系统或网络中加载class信息,存放至方法区的内存空间[2]java堆  ...

深入了解epoll (转)

一. 介绍 Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性.传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃 ...

candy(动态规划)

题目描述 There are N children standing in a line. Each child is assigned a rating value. You are giving ...

Java六大必须理解的问题

Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...

纯CSS打造萌萌哒大白

HTML部分:

BeautifulSoup4----利用find_all和get方法来获取信息

中文文档 官方教学网页源码:

Page title

jQuery设置内容和属性方

何问起 hovertree.com 设置内容 - text().html() 以及 val()text() - 设置或返回所选元素的文本内容html() - 设置或返回所选元素的内容(包括 HTML ...

Linux中不同进程同一个端口,linux系统实现多个进程监听同一个端口相关推荐

  1. linux监听一个端口命令,linux监听端口命令

    在linux系统下,我们可以通过相关的命令监听端口的状态.下面由学习啦小编为大家整理了linux监听端口命令的相关知识,希望对大家有所帮助. 一.linux监听端口命令--nc命令详解 语法 nc [ ...

  2. 单个进程监听多个端口及多个进程监听同一个端口

    单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...

  3. Linux 使用NC命令永久监听本地端口

    Linux可以使用nc命令来测试网络端口是否正常,类似于telnet命令,但也可以用nc命令来监听本地端口,支持TCP.UDP协议. 使用案例如下: 1.测试TCP端口 nc -vz ip tcp-p ...

  4. Tomcat(1)介绍、jdk安装、安装Tomcat ​ 配置Tomcat监听80端口

    Tomcat介绍 (使用yum 下载安装的openjdk下载以后就可以使用) 以下实验用的是在官网下载程序包. Tomcat是一个中间键,要解析java相关的东西,需要先下载JDK 下载jdk 1.下 ...

  5. linux中_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  6. 在linux中查看nginx端口监听,Nginx端口监听(listen指令)

    本节主要来介绍 Nginx 中与端口监听有关的配置指令,下表为端口监听指令及其相关说明. 名称 端口监听指令 指令 listen 作用域 server 默认值 listen*:80 或 *:8000 ...

  7. 如何多个进程监听同一个端口

    1. 问题描述 一个进程监听端口,经验告诉我们,如果多次启动一个进程会报错:"Address already in use!".这是由于bind函数导致的,由于该端口号已经被第一个 ...

  8. centos sudo不能运行_如何在 Linux 中配置 sudo 访问权限 | Linux 中国

    Linux 系统中 root 用户拥有 Linux 中全部控制权力.Linux 系统中 root 是拥有最高权力的用户,可以在系统中实施任意的行为.-- Magesh Maruthamuthu Lin ...

  9. 19. linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解

    linux中权限详解,Linux权限位,读写执行权限真正含义,chmod详解 文章目录 Linux权限位 读写执行 三种权限真正含义和作用 权限对文件的作用 权限对目录的作用 示例 chmod 使用数 ...

最新文章

  1. CMOS及CCD感光sensor的主要技术参数解析
  2. mysql的存储引擎种类,mysql 存储引擎,基本数据类型
  3. 【XSY3048 】Polynominal 数学
  4. linux 安装u盘win7系统安装教程,centos u盘安装 boot制作u盘win7盘工具
  5. shell脚本检查进程脚本
  6. 大数据之-Hadoop之HDFS_HDFS的内容介绍---大数据之hadoop工作笔记0047
  7. 智慧楼宇管理运营端app、运维管理、工单管理、报修管理、维保管理、巡检查询、巡检管理、能源管理、维保查询、智慧社区、巡检统计、工单统计、能源管理、智能楼宇、设备监控、智能社区、系统运营、楼宇运维小程序
  8. python in visual studio
  9. 信用评分卡 (part 6 of 7)
  10. 北航计算机学院复试流程,2018北航计算机考研复试经验
  11. 复杂截面抗扭惯矩计算
  12. 学习weka(1):weka软件安装使用教程
  13. echarts 折线图 中有两条线 ,在鼠标悬停时显示数据
  14. 谈谈多年的创业之路和网络生涯
  15. Vue项目JS脚本错误捕获
  16. 蓝桥杯 第39级台阶
  17. HDU - 1573 X问题
  18. 别傻傻分不清docker run 和 start 的区别了
  19. 网络基本概念之TCP, UDP, 单播(Unicast), 组播(Multicast)
  20. 小米路由器linux界面,小米路由器配置ssh登录方法 | 192.168.1.1登陆页面

热门文章

  1. CATIA软件使用技巧之层叠成形的闭合点
  2. 2022年CSP-J组入门级初赛考试题目
  3. 【有利可图网】PS教程:把图片做出透视效果
  4. 标签条码打印软件:Brady Workstation
  5. 人工智能导论(概要)
  6. 微信小程序实用工具——渐变色按钮(一)
  7. 电脑图标变白怎么办?
  8. 无线模块:BK2425(BK2423) 篇一
  9. 2020德勤面试开始了吗_德勤面试经验
  10. 【拼多多】数据分析笔试+三面面经