(23)socket多进程并发
# 对于服务器自己本身,一个程序只能绑定一个端口
# 同一个端口可以多个客户端来连接,
# 只要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多进程并发的更多相关文章
- python多进程并发和多线程并发和协程
为什么需要并发编程? 如果程序中包含I/O操作,程序会有很高的延迟,CPU会处于等待状态,这样会浪费系统资源,浪费时间 1.Python的并发编程分为多进程并发和多线程并发 多进程并发:运行多个独立的 ...
- Linux Shell多进程并发以及并发数控制
1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&a ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- python进阶(一) 多进程并发机制
python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...
- python 多进程并发与多线程并发
本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...
- IO多路复用丶基于IO多路复用+socket实现并发请求丶协程
一丶IO多路复用 IO多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作 IO多路复用作用: 检测多个socket是否已经发生变 ...
- Appium+python自动化(三十六)- 士兵突击许三多 - 多个appium服务启动,多个设备启动,多进程并发启动设备-并发测试 - 上(超详解)
简介 前面课程只是启动了单个appium服务,只能控制单台设备.如果需要针对多台设备测试那么该如何处理?而且发现群里的小伙伴们也在时不时地在讨论这个问题,想知道怎么实现的,于是宏哥就决定写一片这样的文 ...
- python2,socket多进程的错误pickle.PicklingError: Can't pickle
python2,socket多进程的错误pickle.PicklingError: Can't pickle 源码: #coding:utf-8 import socket import pickle ...
- linux 多进程并发服务__关于子进程回收的方法
以TCPServ 服务程序来说: 1)父进程:负责系统初始化,以及监听(listen),接受连接请求(accept);其中accept 默认阻塞调用. 2)每接受一个连接请求,动态新建(fork)一个 ...
随机推荐
- eval() 和 int()区别,以及eval作用
eval()方法作用是将数据转换回原本的类型 a = str(list) type(a)--->str eval(a) type(a)--->list
- .net如何引用该命名空间
一.在.Net中如何引用该命名空间 (1)System.Windows.Threading 该命名空间在程序集WindowsBase(WindowsBase.dll)下 (2)System.Windo ...
- SSM框架和SSH框架的区别
SSH和SSM定义 SSH 通常指的是 Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层. SSM 则指的是 SpringMVC 做控制 ...
- 透析SOA、RPC、SOAP、REST、ICE、ESB模型发展史
最初的程序全是单机程序,没有网络,没有RPC,更没有RESTful.程序猿写的东西孤独运行在单机上. 那时的程序猿们语言相通,参与开发同一套系统的团队可以面对面沟通. 网络出现了.网络,也带来变乱.网 ...
- 自己绘制table,加分页
- [经验共享] MapGIS实用小功能图解——由excel文件导成MapGIS点文件
项目小组的几个成员都是学地下水和环境的,对于GIS懂得不是很多,于是把一些我们经常用到的mapgis实用小功能做成帮助文档,方便大家使用,发布共享! 1.整理好EXCEL文件(注意X,Y坐标的正确性( ...
- 关于Xamarin、Qml、数据绑定、MVC、MVVM 相关的散讲
关于Xamarin.Qml.数据绑定.MVC.MVVM 相关的散讲 SURFSKY 2017.02 最近又在学习Xamarin了?为什么是“又”?有几个利好消息,让我重新拾起它: ()微软去年收购了X ...
- 【Access】数据库四门功课--[增删改查]基础篇
一.增 以userinfo为例 1.增加一条完整的数据 INSERT INTO userinfo VALUES (1, 2, 3, 4); 基本格式:INSERT INTO AAA VALUES (X ...
- vue父组件给子组件传值:属性的形式
1.父组件怎么传值 2.子组件怎么接受值:依赖props 父页面定义的参数接收返回值,到子组件依旧用定义好的参数,在定义参数的类型,然后渲染数据
- JSESSIONID的简单说明
原文地址:http://blog.csdn.net/chunqiuwei/article/details/23461995 1)第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有 ...