">

笔记14:理解网络编程

摘要:日常学习中对一些知识点进行总结得出该系列文章。学习笔记内容包括前端技术,Django web开发技术,数据库技术如MySQL,MongoDB,PGSQL等等。此外还有一些工具如Dock,ES等等。(本文原创,转载必须注明出处.)

1 相关概念认识

  • 网络通信:万维网通信使用,目的让电脑上不同软件之间通信。
  • IP地址:分为IP4与IP6

1558531665591

1558531862924

  • IP地址分类:电脑唯一区分号

1558531941583

  • 端口号:同一个Ip下的不同程序的识别

1558532098004

  • 进程:运行的程序就叫做进程,知名端口0—-1023,动态端口1024—65535。其中网站浏览默认端口80,ftp端口21
  • socket套接字:用来完成网络通信必备的东西。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# !/usr/bin/env python
# coding:utf-8

import socket
def handle_request(client):
buf = client.recv(1024)
client.send("HTTP/1.1 200 OK\r\n\r\n")
client.send("Hello, World")
def main():
# 创建socket对象,socket.AF_INET表示IP4, socket.SOCK_STREAM表示TCP通信
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8080))# 绑定端口和ip,本机ip,与客户端相同的端口号
sock.listen(5) # 最大连接数

while True:
connection, address = sock.accept()
handle_request(connection)
connection.close()
if __name__ == '__main__':
main()

1558536535562

  • 通信模型:UDP与TCP,udp可以理解成写信模式,每封信都需要地址端口等,另外存在不安全性,数据可能丢失。TCP可以理解为打电话的形式,相对就安全很多。TCP还具有超时重传,错误校验,流量控制和阻塞管理。
  • 下载文件

1558538940566

1558539531863

2 进程、线程与协程

2.1 多任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'''
多任务操作:我们希望两个线程同时执行
'''

import time
import threading


# 唱歌
def sing():
for i in range(5):
print('正在唱歌===========>.......光辉岁月')
time.sleep(1)


# 跳舞
def dance():
for i in range(5):
print('正在跳舞===========>.......新疆舞')
time.sleep(1)


#---------------------------------非多线程操作-----------------------------
def main1():
sing()
dance()


#---------------------------------线程:多任务操作-----------------------------
def main2():
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()


if __name__ == '__main__':
# main1()
main2()
  • 时间片轮转:单核cpu处理多个应用程序,每个程序分配极少的时间如0.001s,轮换切换时间极短,人工难以区分,就误以为一起同时运行了。这里只是完成多任务的一种策略。例子:单核CUP运行QQ,切换微信等
  • 并行:真正的多任务,每个程序一个内核cpu。例如:双核CPU分别运行QQ与微信
  • 并发:假的多任务,cup核数量少于任务数。例如:单核CPU运行QQ与微信

2.2 线程

1558615616048

  • 红色箭头表示程序的线程,调用start方法时候,生成新的线程。这时候可以有两个线程同时执行代码,由此出现多任务的情况。

1558616261683

线程的封装

1558616676609

  • 全局变量:如果指定固定值不加global,如果指的同一个地址不需要加

1558617333465

  • 线程传参

1558618933329

  • 互斥锁

1558619797729

  • 死锁:银行家算法

死锁是一种状态,在多任务中A任务在等待。B任务也在等待,。。。,N任务也在等待。就造成一种死锁现象。都在等待解锁,就造成阻塞,程序永远卡住。为了避免死锁出现以下策略:

(1) 添加超时时间

(2)程序设计时要尽量避免(例如,银行家算法)等

1558620232501

银行家算法核心思想就是将现有的资源分配给多个任务,任务执行完解锁,以此类推完成所有任务。

2.3 进程

  • exe就是二进制文件,就是一个静态的程序。将这个程序运行起来就是进程了。程序只有一个,但是可以包含多个进程,一个进程可以包含多个线程。最简单的理解,比如微信是一个程序,运行起来以后会使用语音、视频、网络、声卡等功能,每个功能是一个进程。这样看起来程序运行起来就包含多个进程了。进程是操作系统分配的单位。
  • 进程的状态

1558622181248

进程也可以完成多任务,不过占用资源比较大。线程可以完成多任务,占用资源少。

  • 进程和线程对比
    • 进程是一堆资源的继承,包括网络,硬盘,声卡等。进程是资源分配单位。一个进程里面至少一个主线程。进程可以理解为工厂上面的流水线,线程就是流水线上的工人。
    • 线程比较轻量级。线程执行开销小,不利于资源管理和保护。进程相反。
  • 进程间的通信Queue:放数据put,取数据get,判空empty,判满full

1558623951778

1558623999618

  • 进程通信案例,其中一个进程是网上下载数据,一个进程是分析数据。如果是线程可以通过全局变量共享数据。如果是进程需要引入通信queue的get和put读写数据达到共享。

    1558624351188

1558624444865

  • 进程池pool:对进程管理,join阻塞主进程,等待进程池里面进程执行。进程池中如果有异常是不会在屏幕上打印的

1558624938788

2.4 协程

  • range与xrange的区别,前者基于迭代器返回的结果,占用大量空间;后者返回可以迭代对象,什么时候用什么时候取。Python3经过改进后,将range改进近似xrange节约空间

  • 迭代器执行保存的结果,迭代器生成代码next控制结果,具备yield标识有return的效果,而且运行速度快。

  • yield实现多任务

    1558627106338

  • pip安装到python2里面,pip3安装到python里面

  • greenlet是对yield的高端封装,可以直接写greenlet不用再添加yeild。通过switch切换函数

1558627329942

  • gevent异步并发库,其采用协程方式。(推荐使用,yield和greenlet了解即可)

1558627761221

  • gevent图片下载案例

1558628407603

2.5 进程、线程与协程的区别

  • 进程是资源分配单位,线程是操作系统调度单位
  • 进程切换需要很大的资源,效率低;线程切换资源一般效率一般
  • 协程切换任务资源很小,效率高
  • 多进程多线程根据cpu核数不同可能是并发,但是协程在一个线程中是并发

3 技术QQ群

机器学习和自然语言QQ群:436303759

机器学习和自然语言(QQ群号:436303759)是一个研究深度学习、机器学习、自然语言处理、数据挖掘、图像处理、目标检测、数据科学等AI相关领域的技术群。其宗旨是纯粹的AI技术圈子、绿色的交流环境。本群禁止有违背法律法规和道德的言谈举止。群成员备注格式:城市-自命名。微信订阅号:datathinks

白宁超 wechat
扫一扫关注微信公众号,机器学习和自然语言处理,订阅号datathinks!