# 对于服务器自己本身,一个程序只能绑定一个端口

# 同一个端口可以多个客户端来连接,

# 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一

客户端我这里只写一个,基本大同小异,下面的都是服务端的

client:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
while True:
print(sk.recv(1024))
sk.send(b'bye')
sk.close()

(1) Process模块开子进程实现

server:

import socket
from multiprocessing import Process def communicate(conn):
while True:
conn.send(b'hello')
print(conn.recv(1024))
if __name__ == "__main__":
sk = socket.socket()
# 对于服务器自己本身,一个程序只能绑定一个端口
# 同一个端口可以多个客户端来连接,
# 只要server_ip+ server_port +client_ip + cilent_port 不一样,就是唯一
sk.bind(("127.0.0.1", 9000))
sk.listen()
while True:
conn, addr = sk.accept()
Process(target=communicate, args=(conn,)).start()

执行效果图:同时可以连接多个客户端

(2)socketserver模块实现

功能:实现TCP同时连接多个客户端

并发:一个cpu同时不停地执行多个程序

server:

import socketserver

# 自定义一个类 MyServer
class MyServer(socketserver.BaseRequestHandler):
# handle 方法是每当有一个客户端发起connect来接之后,自动执行handle
def handle(self):
# self.request # 相当于conn
# self.client_address # 相当于addr
conn = self.request
while True:
print(conn.recv(1024))
conn.send(b'hello')
# 避免端口报错
socketserver.TCPServer.allow_reuse_address = True
# ip 端口号 | 自定义类
server = socketserver.ThreadingTCPServer(("127.0.0.1", 9000), MyServer)
# 循环调用
server.serve_forever()

(3) 进程池实现

server:

import socket
from multiprocessing import Pool
def talk(conn):
while True:
conn.send(b"hello")
print(conn.recv(1024))
conn.close()
if __name__ == "__main__":
sk = socket.socket()
sk.bind(("127.0.0.1", 9000))
sk.listen()
# Pool默认获取cpu_counter cpu最大核心数 我的机器是6
p = Pool()
while True:
conn, addr = sk.accept()
p.apply_async(talk, args=(conn,))
sk.close()

(4) 多线程实现

server:

import socket
from threading import Thread
def func(conn):
while True:
conn.send(b"hello")
print(conn.recv(1024))
conn.close()
if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
while True:
conn,addr = sk.accept()
t = Thread(target=func,args=(conn,))
t.start()
sk.close()

(5) 协程实现 gevent

server:

from gevent import monkey; monkey.patch_all()
import socket
import gevent
import os
from threading import current_thread as cthread
import time def talk(conn):
while True:
print(cthread().ident,os.getpid())
time.sleep(0.1)
conn.send(b'hello')
print(conn.recv(1024)) sk = socket.socket()
sk.bind( ("127.0.0.1" ,9000))
sk.listen() # 用一个线程接受了所有访问的连接.(因为利用了协程)
while True:
conn,addr = sk.accept()
# spawn 和 submit 用法一样 参数默认往后写就可以了
gevent.spawn(talk,conn)

 

(23)socket多进程并发的更多相关文章

  1. python多进程并发和多线程并发和协程

    为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...

  2. Linux Shell多进程并发以及并发数控制

    1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...

  3. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  4. python进阶(一) 多进程并发机制

    python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...

  5. python 多进程并发与多线程并发

    本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...

  6. IO多路复用丶基于IO多路复用+socket实现并发请求丶协程

    一丶IO多路复用 IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 IO多路复用作用: 检测多个socket是否已经发生变 ...

  7. Appium+python自动化(三十六)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 上(超详解)

    简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...

  8. python2,socket多进程的错误pickle.PicklingError: Can't pickle

    python2,socket多进程的错误pickle.PicklingError: Can't pickle 源码: #coding:utf-8 import socket import pickle ...

  9. linux 多进程并发服务__关于子进程回收的方法

    以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...

随机推荐

  1. IIS网站 由http协议改变为https协议

    https://www.cnblogs.com/boosasliulin/p/6811231.html?utm_source=itdadao&utm_medium=referral

  2. spark MLlib实现的基于朴素贝叶斯(NaiveBayes)的中文文本自动分类

    1.自动文本分类是对大量的非结构化的文字信息(文本文档.网页等)按照给定的分类体系,根据文字信息内容分到指定的类别中去,是一种有指导的学习过程. 分类过程采用基于统计的方法和向量空间模型可以对常见的文 ...

  3. Ajax请求二进制流并在页面展示

    后端代码: public void getIntegralQrcode(HttpServletResponse response, String token) throws BizException, ...

  4. git之reset图解

    https://blog.csdn.net/longintchar/article/details/81843048 1.三棵树. 此时如果我们运行 git status,会发现没有任何改动,因为现在 ...

  5. CentOS 7 zabbix添加监控服务器

    CentOS 7 yum安装zabbix 设置中文界面 安装环境 CentOS 7  关闭防火墙和SElinux 在被监控端安装zabbix-agent [root@zabbix-agent ~]# ...

  6. 解决多版本共存时,python/pip等命令失效

    问题呈现: Windows环境下,多版本Python解释器共存时,由于未配置环境变量或者反复卸载重装解释器等原因,CMD交互下输入Python或者pip等命令时失效 解决方式: 1)配置各个解释器的环 ...

  7. vue实现验证码倒计时60秒的具体代码

    vue实现验证码倒计时60秒的具体代码 <span v-show="show" @click="getCode">获取验证码</span> ...

  8. vue-cli —— 项目打包及一些注意事项

    打包方法: 1.把绝对路径改为相对路径:打开config/index.js 会看到一个build属性,这里就是我们打包的基本配置了.在这里可以修改打包的目录,打包的文件名.最重要的是一定要把绝对目录改 ...

  9. python各种转义字符

  10. leetcode 66.加一 python3

    class Solution: def plusOne(self, digits): """ :type digits: List[int] :rtype: List[i ...