Python之路_Day10

Python之路_Day10_课堂笔记


上节回顾:

socket:

1、导入模块

2、创建socket

3、

字节

send:每次发送可能没有完全发送,send发送后会有一个返回值,是本次发送了多少。

sendall:循环发送,直到全部发送完全。

接收

recv(2048):最多可以接收2048字节,上传文件时需要注意

粘包:

socketserver:

1、自定义类

2、继承socketserver.BaseRequestHandler类

3、重写handle方法

4、socketserver 调用上面的类

5、运行


本节内容:

一、作业问题:

1、socket发送字符串

2、socket发送文件

客户端:

文件大小

发消息

服务端:

接收消息(文件大小)

断点续传

文件打开方法:

a:追加

w:清空写

文件指针:

seek(num)

二、小知识

三、python27多继承,python35多继承

四、socketserver源码

支持并发处理socket

socket源码

五、IO多路复用

六、多线程、多进程

Alex甄嬛西游转


一、小知识

作用域

Python中无块级作用域

Java/C#                  不可以运行

python/javascript    可以运行

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # Python中无块级作用域
  5. if 1 == 1:
  6. name = ‘sandler‘
  7. print(name)

Python中以函数为作用域

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # Python中以函数为作用域
  5. def func():
  6. name = ‘alex‘
  7. func()
  8. print(name)

Python作用域链,由内向外找,直到找不到报错

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # Python作用域链,由内向外找,直到找不到报错
  5. name = ‘sandler‘
  6. def f1():
  7. name = ‘f1‘
  8. def f2():
  9. name = ‘f2‘
  10. print(name)
  11. f1()
Python在函数为执行前,作用域已经确定,作用域链也已经确定

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # Python在函数为执行前,作用域已经确定,作用域链也已经确定
  5. name = ‘sandler‘
  6. def f1():
  7. print(name)
  8. def f2():
  9. name = ‘yuli‘
  10. f1()
  11. f2()
  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. li = [lambda :x for x in range(10)]
  5. # li列表
  6. # li列表中的元素:【函数,函数,函数...】
  7. # 函数在没有执行前,内部代码不执行
  8. # ?li[0],函数
  9. # ?函数()
  10. # 返回值是????
  11. print(li[0]())


二、python27多继承,python35多继承

Python2

新式类

经典类==>一条道走到黑

Python3


三、SocketServer源码

支持并发处理socket

Socket源码

1、TCPServer =====> __init__()

2、BaseServer =====> __init__()

3、BaseServer =====> server_forever()

4、BaseServer =====> _handle_request_noblock()

5、ThreadingMixIn ===> process_request()

6、ThreadingMixIn ===> process_request_thread()

7、BaseServer =====> finish_process()

8、BaseServer =====>

9、MyClass

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # socketserver源码
  5. import socketserver
  6. class MyClass(socketserver.BaseRequestHandler):
  7. def handle(self):
  8. pass
  9. # 创建socket对象
  10. # accept
  11. # server_address = (‘127.0.0.1‘,9999)
  12. # RequestHandlerClass = MyClass == ()
  13. # self.RequestHandlerClass() = MyClass() == ()
  14. # 1、obj封装了self.RequestHandlerClass = MyClass
  15. # 2、创建了socket,bind,listen
  16. obj = socketserver.ThreadingTCPServer((‘127.0.0.1‘,9999),MyClass)
  17. obj.serve_forever()

四、IO多路复用

概述:

select、poll、epoll

监听socket对象内部是否变化了?

什么时候变化?连接或收发消息

服务器端的socket对象发生变化==>有新链接来了....

sk:有新链接来了....

conn:有新消息了,要收“发”消息了

IO多路复用===>监听socket对象内部是否变化了?

IO多路复用测试

Server

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. import socket
  5. import select
  6. sk = socket.socket()
  7. sk.bind((‘127.0.0.1‘,9999,))
  8. sk.listen(5)
  9. while True:
  10. rlist, w, e, = select.select([sk,],[],[],1)
  11. print(rlist)
  12. for r in rlist:
  13. print(r)
  14. conn, address = r.accept()
  15. conn.sendall(bytes(‘hello‘,encoding=‘utf-8‘))

Client

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. import socket
  5. sk = socket.socket()
  6. sk.connect((‘127.0.0.1‘, 9999,))
  7. data = sk.recv(1024)
  8. print(data)
  9. while True:
  10. input(‘>>> ‘)
  11. sk.close()

IO多路复用测试(第二版)

Server

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. import socket
  5. import select
  6. sk = socket.socket()
  7. sk.bind((‘127.0.0.1‘,9999,))
  8. sk.listen(5)
  9. inputs = [sk,]
  10. while True:
  11. rlist, w, e, = select.select(inputs,[],[],1)
  12. print(len(inputs),len(rlist))
  13. # 监听sk(服务器端)对象,如果sk对象发送变化,表示有客户端来连接了,此时rlist值为[sk]
  14. # 监听conn对象,如果conn发送变化,表示客户端有新消息发送过来,此时rlist的值为[客户端]
  15. for r in rlist:
  16. if r == sk:
  17. conn, address = r.accept()
  18. # conn是什么?conn其实是socket对象
  19. inputs.append(conn)
  20. conn.sendall(bytes(‘hello‘,encoding=‘utf-8‘))
  21. else:
  22. r.recv(1024)

Client

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. import socket
  5. sk = socket.socket()
  6. sk.connect((‘127.0.0.1‘, 9999,))
  7. data = sk.recv(1024)
  8. print(data)
  9. while True:
  10. inp = input(‘>>> ‘)
  11. sk.sendall(bytes(inp,encoding=‘utf-8‘))
  12. sk.close()

IO多路复用测试之读写分离

Server

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 读写分离测试服务端
  5. import socket
  6. import select
  7. sk = socket.socket()
  8. sk.bind((‘127.0.0.1‘,9999,))
  9. sk.listen(5)
  10. inputs = [sk,]
  11. outputs = []
  12. while True:
  13. rlist, wlist, e, = select.select(inputs,outputs,[],1)
  14. print(len(inputs),len(rlist),len(outputs),len(wlist))
  15. # 监听sk(服务器端)对象,如果sk对象发送变化,表示有客户端来连接了,此时rlist值为[sk]
  16. # 监听conn对象,如果conn发送变化,表示客户端有新消息发送过来,此时rlist的值为[客户端]
  17. for r in rlist:
  18. if r == sk:
  19. conn, address = r.accept()
  20. # conn是什么?conn其实是socket对象
  21. inputs.append(conn)
  22. conn.sendall(bytes(‘hello‘,encoding=‘utf-8‘))
  23. else:
  24. print(‘========‘)
  25. try:
  26. ret = r.recv(1024)
  27. if not ret:
  28. raise Exception(‘断开连接‘)
  29. else:
  30. outputs.append(r)
  31. except Exception as e:
  32. inputs.remove(r)
  33. for w in wlist:
  34. w.sendall(bytes(‘response‘,encoding=‘utf-8‘))
  35. outputs.remove(w)

Client

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 读写分离测试客户端
  5. import socket
  6. sk = socket.socket()
  7. sk.connect((‘127.0.0.1‘, 9999,))
  8. data = sk.recv(1024)
  9. print(data)
  10. while True:
  11. inp = input(‘>>> ‘)
  12. sk.sendall(bytes(inp,encoding=‘utf-8‘))
  13. print(sk.recv(1024))
  14. sk.close()

IO多路复用测试之读写分离(升级版)

Server

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 读写分离测试服务端
  5. import socket
  6. import select
  7. sk = socket.socket()
  8. sk.bind((‘127.0.0.1‘,9999,))
  9. sk.listen(5)
  10. inputs = [sk,]
  11. outputs = []
  12. messages = {}
  13. while True:
  14. rlist, wlist, e, = select.select(inputs,outputs,[],1)
  15. print(len(inputs),len(rlist),len(outputs),len(wlist))
  16. # 监听sk(服务器端)对象,如果sk对象发送变化,表示有客户端来连接了,此时rlist值为[sk]
  17. # 监听conn对象,如果conn发送变化,表示客户端有新消息发送过来,此时rlist的值为[客户端]
  18. for r in rlist:
  19. if r == sk:
  20. conn, address = r.accept()
  21. # conn是什么?conn其实是socket对象
  22. inputs.append(conn)
  23. messages[conn] = []
  24. conn.sendall(bytes(‘hello‘,encoding=‘utf-8‘))
  25. else:
  26. print(‘========‘)
  27. try:
  28. ret = r.recv(1024)
  29. if not ret:
  30. raise Exception(‘断开连接‘)
  31. else:
  32. outputs.append(r)
  33. messages[r].appent(ret)
  34. except Exception as e:
  35. inputs.remove(r)
  36. del messages[r]
  37. for w in wlist:
  38. msg = messages[w].pop()
  39. resp = msg + bytes(‘response‘,encoding=‘utf-8‘)
  40. w.sendall(resp)
  41. outputs.remove(w)

Client

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 读写分离测试客户端
  5. import socket
  6. sk = socket.socket()
  7. sk.connect((‘127.0.0.1‘, 9999,))
  8. data = sk.recv(1024)
  9. print(data)
  10. while True:
  11. inp = input(‘>>> ‘)
  12. sk.sendall(bytes(inp,encoding=‘utf-8‘))
  13. print(sk.recv(1024))
  14. sk.close()

五、多线程、多进程

1、一个应用程序,可以有多进程和多线程

2、默认:单进程,单线程

3、单进程,多线程

IO操作,不占用CPU

多线程提高并发

计算型操作,占用CPU

多进程提供并发

4、GIL,全局解释器锁

==================================>>

多线程、多进程 提供并发

IO密集型:使用多线程

计算密集型:使用多进程

多线程示例:

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 多线程并发
  5. import threading
  6. import time
  7. def f1(args):
  8. time.sleep(1)
  9. print(args)
  10. t = threading.Thread(target=f1, args=(123,))
  11. t.start()
  12. f1(111)

多线程示例2:

  1. #!/usr/bin/env python
  2. # -.- coding: utf-8 -.-
  3. # By sandler
  4. # 多线程并发
  5. import threading
  6. import time
  7. def f1(args):
  8. time.sleep(5)
  9. print(args)
  10. # 单进程,单线程的应用程序
  11. for i in range(10):
  12. f1(i)
  13. # 单进程,多线程的应用程序
  14. for i in range(10):
  15. t = threading.Thread(target=f1, args=(i,))
  16. t.setDaemon(True) # true,表示主线程不等此子线程结束,
  17. t.start() # 不代表当前线程会被立即执行
  18. t.join() # 表示主线程到此,等待子线程执行结束,才会继续往下执行,参数表示主线程在此最多等待几秒






来自为知笔记(Wiz)

时间: 2024-10-25 19:46:08

Python之路_Day10的相关文章

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

七日Python之路--第十二天(Django Web 开发指南)

<Django Web 开发指南>.貌似使用Django1.0版本,基本内容差不多,细读无妨.地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一个新的值为12的整数对象,而float(12)则会返回12.0. (2)其他序列操作符 连接(+),复制(*),以及检查是否是成员(in, not in) '**'.join('**')   或  '***%s***%d' % (str, int)

七日Python之路--第九天

众所周知,代码这东西不是看出来的.程序这东西只哟一个标准. 下面找点开源的东西看看,学习一下大婶们的犀利编码...... 推荐一下: 虽然有点老了:http://www.iteye.com/topic/405150,还有就是GitHub上面搜索一下Django就能出来很多,当然还有OSChina.只是有个问题,就是Django版本不同,具体的内容可能会有些不同,但大概还是相同的.领略即可,然后书写自己的代码. 首要的还是官方文档. 看着还是有些难度的.偶然发现一个不错的Blog:http://w

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in

Python之路【第八篇】:堡垒机实例以及数据库操作

Python之路[第八篇]:堡垒机实例以及数据库操作 堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: + import paramiko transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', password='123') ssh