Day10 网络编程(续)
作用域
Python的作用域是函数,没有块级作用域
if 1 == 1:
name = 'wang' print(name)#wang
for i in range(10):
name = i print(name)#9
def func():
name = 'wang' func()
print(name)#NameError: name 'name' is not defined
name = 'wang' def f1():
name = 'snow'
print(name) f1()#snow
作用域链
name = 'wang'
def f1():
name = 'a'
def f2():
name = 'b'
print(name)
f2()
f1()#b
name = 'wang'
def f1():
print(name) def f2():
name = 'snow'
f1() f2()#wang
在函数未执行之前,作用域已经确定
name = 'wang'
def f1():
print(name) def f2():
name = 'snow'
return f1 ret = f2()
ret()#wang
li = [x+100 for x in range(10) if x > 5]
print(li)#[106, 107, 108, 109]
def f1():
return 1
#相当于
li = [lambda :1]
面试题
li = [lambda :x for x in range(10)]
#li为列表
#li列表中的元素:【函数,函数,函数...】
#函数在没有执行前,内部代码不执行
#列表的第一个元素li[0]是函数
#函数()执行
#li[0]()返回值为9
ret = li[0]()
print(ret)#9
li = [] for i in range(10):
def f1():
return i li.append(f1) ret1 = li[0]()
ret2 = li[1]()
ret3 = li[2]()
ret4 = li[3]()
ret5 = li[4]()
ret6 = li[5]()
ret7 = li[6]()
print(ret1)
print(ret2)
print(ret3)
print(ret4)
print(ret5)
print(ret6)
print(ret7)#9
#9#9#9#9#9#9
只要执行了,就能拿到值
li = [] for i in range(10):
def f1(x = i):
return x
li.append(f1) print(li[0]())
print(li[1]())
print(li[2]())
print(li[3]())#0#1#2#3
Python3.x中类默认继承object,Python2.7中类不默认继承object;Python2.7中不继承object的类叫经典类,继承的时候一条道走到黑,继承object的类叫新式类,继承的时候与Python3一致。
IO多路复用实现并发
概述:select、poll、epoll
目的:监听socket对象的内部是否变化?
什么时候变化?连接或收发消息的时候。
sk:服务器端接收客户端的连接,并创建conn对象
conn:要收”发”消息了
简单的IO多路复用
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9990,))
sk.listen(5) while True:
rlist, w, e = select.select([sk,], [], [], 1)
print(rlist)
#rlist中获取的就是socket对象列表,[sk,]
for r in rlist:
print(r)
conn, addr = r.accept()
conn.sendall(bytes('hello', encoding='utf-8'))
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket sk = socket.socket()
sk.connect(('127.0.0.1', 9990,))
data = sk.recv(1024)
print(data)
while True:
input('>>>')
sk.close()
IO多路复用实现伪并发
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
while True:
rlist, w, e = select.select(inputs, [], [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
r.recv(1024)
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket sk = socket.socket()
sk.connect(('127.0.0.1', 9999,))
data = sk.recv(1024)
print(data)
while True:
inp= input('>>>')
sk.sendall(bytes(inp, encoding='utf-8'))
sk.close()
简单的读写分离
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
outputs = []
while True:
rlist, wlist, e = select.select(inputs, outputs, [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist), len(outputs))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
print('==========')
try:
ret = r.recv(1024)
#r.sendall(ret)
if not ret:
raise Exception('断开连接')
else:
outputs.append(r)
except Exception as e:
inputs.remove(r)
for w in wlist:
#所有给我发过消息的人
w.sendall(bytes('respones', encoding='utf-8'))
outputs.remove(w)
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket sk = socket.socket()
sk.connect(('127.0.0.1', 9999,))
data = sk.recv(1024)
print(data)
while True:
inp= input('>>>')
sk.sendall(bytes(inp, encoding='utf-8')) sk.close()
IO多路复用增强版
server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket
import select sk = socket.socket()
sk.bind(('127.0.0.1', 9999,))
sk.listen(5)
inputs = [sk,]
outputs = []
messages = {}
"""
messages = {
xiaoming:[消息1, 消息2]
xiaozhu:[消息1, 消息2]
}
"""
while True:
rlist, wlist, errorlist = select.select(inputs, outputs, [], 1)
#len(inputs):监听了几个对象,len(rlist):几个对象发生了变化
print(len(inputs), len(rlist), len(outputs))
#rlist中获取的就是socket对象列表,[sk,]
#rlist = [sk,]
#rlist = [xiaoming,]
#rlist = [xiaozhu, xiaogou,]
for r in rlist:
if r == 'sk':
#新客户端来连接
conn, addr = r.accept()
# conn是socket对象
inputs.append(conn)
messages[conn] = []
conn.sendall(bytes('hello', encoding='utf-8'))
else:
#有人(r)给我发消息了
print('==========')
try:
ret = r.recv(1024)
#r.sendall(ret)
if not ret:
raise Exception('断开连接')
else:
outputs.append(r)
messages[r].append(ret)
except Exception as e:
inputs.remove(r)
del messages[r]
for w in wlist:
#所有给我发过消息的人
msg = messages[w].pop()
resp = msg + bytes('respones', encoding='utf-8')
w.sendall(resp)
outputs.remove(w)
client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: wanghuafeng import socket sk = socket.socket()
sk.connect(('127.0.0.1', 9999,))
data = sk.recv(1024)
print(data)
while True:
inp= input('>>>')
sk.sendall(bytes(inp, encoding='utf-8')) sk.close()
select:支持跨平台,底层通过for循环实现,效率不高,监听有个数(1024)限制。
poll:linux使用,内部for循环实现,效率不高,监听个数没有限制。
epoll:内部不在通过for循环,socket对象谁变化谁通知,nginx通过epoll实现,效率高。
IO多路复用不仅仅支持socket对象,只要是IO操作都支持。
Day10 网络编程(续)的更多相关文章
- 网络编程Socket之TCP之close/shutdown具体解释(续)
接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...
- UNIX网络编程——原始套接字的魔力【续】
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...
- Day10 Python网络编程 Socket编程
一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...
- [转]C#网络编程(异步传输字符串) - Part.3
本文转自:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part3.aspx 这篇文章我们将前进一大步,使用异步的方式 ...
- C/C++ 用libcurl库进行http通讯网络编程
C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...
- TCP/IP的经典网络编程
TCP/IP网络编程之四书五经 ...
- 第十三章:Python の 网络编程进阶(二)
本課主題 SQLAlchemy - Core SQLAlchemy - ORM Paramiko 介紹和操作 上下文操作应用 初探堡垒机 SQLAlchemy - Core 连接 URL 通过 cre ...
- python学习之路网络编程篇(第二篇)
新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...
- 基于Socket网络编程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a2011480169/article/details/73602708 博客核心内容: 1.Sock ...
随机推荐
- 学习了几天的jQuery Mobile的一点感受
一.Write less Do more! 这好像就是jQuery Mobile的口号吧.基于jQuery类库的jQuery Mobile移动web插件,有了这个轻量级插件后,排版方便了许多,很多样 ...
- python第三方库推荐 - 通过ntplib在windows上同步时间
很多时候我们有通过程序脚本同步校正北京时间的需求. 在linux上同步时间比较方便,安装个ntpdate软件就行了. 但是在windows的要同步时间比较麻烦. 这时想到的就是从网络获取一个准确的时间 ...
- WKWebView使用过程中的那些坑
问题产生背景: 新开发的页面中有一部分的界面是需要展示后端接口返回的HTML代码,包括文字和图片.所以就自然而然的要使用iOS原生的WebKit. 鉴于Xcode 8发布以后,编译器支持的最低版本(D ...
- URLConnection类详解
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html ...
- springmvc xml 空模板
<?xml version="1.0" encoding="UTF-8"?><!-- Bean头部 --><beans xmlns ...
- js--小结⑦---格式转换
- VS2010在WIN7 64位系统下架设网站及路由器配置
步骤一:安装IIS 打开[控制面板]-[程序和功能],在左侧进入[打开或关闭windows功能],按照下图选择Internet信息项目下的子选项并安装: 步骤二:配置应用程序池 打开[控制面板]-[管 ...
- VS2015 Cordova Ionic移动开发(二)
一.创建空白Cordova应用 打开VS,选择[新建项目],选择其它语言JavaScript或者TypeScript,语言的话就按个人喜好,喜欢JS就用JS,喜欢TS就用TS,推荐使用TS书写,代码结 ...
- asp.net mvc 通过修改路由规则来实现页面的URL多参数传递
[原文]http://blog.csdn.net/risingsun001/article/details/9068187 修改MVC3中的路由规则 在Global.asax.cs中,修改路由规则 原 ...
- app图标和启动页设置
弄了一下午,终于把iOS中图标的设置和启动页的设置弄明白了.我想以后再也不会浑了. 进入正题: 一:apple 1).iPhone4s 3.5寸屏,也就是640*960,但在模拟器上正常用的是320* ...