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

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

# 只要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. js常用的400个特效

    JavaScript实现可以完全自由拖拽的效果,带三个范例     http://www.sharejs.com/showdetails-501.aspx javascript实现可以自由拖动的树形列 ...

  2. python小程序--Three(三级菜单)

    #!/usr/bin/env python # _*_ coding:utf8 _*_ data = { "山东省":{ "滨州市":{"惠民县&qu ...

  3. 001-ADO.NET

    Web.config <connectionStrings> <add name="connStr" connectionString="server= ...

  4. Python语言——基础01-环境安装、注释、变量

    开篇导言: 今天开始进行python学习的笔记更新,以后我都用截图的方式更新,方便不麻烦,界面美观,今天学习更新的python学习内容是环境安装.注释.变量的内容 关注我博客的童鞋从现在开始也可以跟着 ...

  5. docker容器实战-----初级<2>

    第二章  docker容器 1. Docker是通过内核虚拟化技术(namespaces及cgroups cpu.内存.磁盘io等)来提供容器的资源隔离与安全保障等.由于Docker通过操作系统层的虚 ...

  6. Intellij IDEA 配置Tomcat远程调试

    一.前言 在服务器端开发过程中,由于服务器环境差异导致运行结果不符合预期. 所以就需要到IDEA Debug 服务器代码.看起来貌似很高大上的事情. 今天就说说使用Intellij IDEA 配置的方 ...

  7. bochs模拟器创建映像文件 、写入文件并启动

    安装 bochs,dd for windows,nasm,并将安装目录加入到环境变量中. 我用的bochs版本是2.6.8 1.用 bochs 中 bximage.exe 创建新的 img 文件 2. ...

  8. org.w3c.dom.Node.getTextContent()方法编译错误-已解决

    org.w3c.dom.Node.getTextContent()方法编译错误. 在项目的Java Build Path | Order and Export选项卡中,将JRE System Libr ...

  9. tomcat是什么?Tomcat 下载、安装、配置图文教程

    你用浏览器上网的所有操作,所有请求发送给服务器(tomcat),服务器通过请求,找相应的逻辑处理程序(jsp或servelet或java类,就是有关java语言的所有可以处理逻辑的代码,其中包括访问后 ...

  10. Hive中常用的参数配置

    -- 查看当前环境参数配置set -v;-- 重置配置为默认值reset; -- 调整map数-- input的文件大小,集群设置的文件块大小,hive中通过set dfs.block.size;命令 ...