ネットワークプログラミングを理解しやすいです
コンセプトの1つの関連の理解
- ネットワーク通信:ワールド・ワイド・ウェブを利用した通信は、コンピュータ上の異なるソフトウェア間の通信を行うことを目指しています。
- IPアドレス:分割IP4とIP6
- IPアドレスのクラス:コンピュータは、一意の番号を区別
- ポート番号:IPでは、別のプログラムとの識別
- プロセス:プログラム実行中のプロセス、周知のポート0 --- 1023動的ポート1024--65535と呼ばれています。これは、Webブラウザのデフォルトのポート80、FTPポート21
- ソケットソケット:不可欠なものへのネットワーク通信のために。
XXXXXXXXXX
#!は/ usr / binに/ ENVパイソン
#コーディング:UTF-8
輸入ソケット
(クライアント)DEFでhandle_request:
BUF = client.recv(1024)
client.send( "HTTP / 1.1 200 OKの\ r \ nの\ rをする\ n")
client.send( "こんにちは、世界")
デフメイン():
#はsocket.AF_INETは、TCP通信用IP4、socket.SOCK_STREAMを表し、ソケットオブジェクトを作成します。
靴下= socket.socket(はsocket.AF_INET、socket.SOCK_STREAM)
sock.bind(( 'localhostの'、8080))#バインドポートとIP、マシンのIP、同じクライアントのポート番号
接続のsock.listen(5)#最大数
真の中に:
接続、アドレス= sock.accept()
でhandle_request(接続)
connection.close()
__name__ == '__main__' の場合:
メイン()
- 通信模型:UDP与TCP,udp可以理解成写信模式,每封信都需要地址端口等,另外存在不安全性,数据可能丢失。TCP可以理解为打电话的形式,相对就安全很多。TCP还具有超时重传,错误校验,流量控制和阻塞管理。
- 下载文件
2 进程、线程与协程
2.1 多任务
xxxxxxxxxx
'''
多任务操作:我们希望两个线程同时执行
'''
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 线程
- 红色箭头表示程序的线程,调用start方法时候,生成新的线程。这时候可以有两个线程同时执行代码,由此出现多任务的情况。
线程的封装
- 全局变量:如果指定固定值不加global,如果指的同一个地址不需要加
- 线程传参
- 互斥锁
- 死锁:银行家算法
死锁是一种状态,在多任务中A任务在等待。B任务也在等待,。。。,N任务也在等待。就造成一种死锁现象。都在等待解锁,就造成阻塞,程序永远卡住。为了避免死锁出现以下策略:
(1) 添加超时时间
(2)程序设计时要尽量避免(例如,银行家算法)等
银行家算法核心思想就是将现有的资源分配给多个任务,任务执行完解锁,以此类推完成所有任务。
2.3 进程
- exe就是二进制文件,就是一个静态的程序。将这个程序运行起来就是进程了。程序只有一个,但是可以包含多个进程,一个进程可以包含多个线程。最简单的理解,比如微信是一个程序,运行起来以后会使用语音、视频、网络、声卡等功能,每个功能是一个进程。这样看起来程序运行起来就包含多个进程了。进程是操作系统分配的单位。
- 进程的状态
进程也可以完成多任务,不过占用资源比较大。线程可以完成多任务,占用资源少。
-
进程和线程对比
- 进程是一堆资源的继承,包括网络,硬盘,声卡等。进程是资源分配单位。一个进程里面至少一个主线程。进程可以理解为工厂上面的流水线,线程就是流水线上的工人。
- 线程比较轻量级。线程执行开销小,不利于资源管理和保护。进程相反。
-
进程间的通信Queue:放数据put,取数据get,判空empty,判满full
-
进程通信案例,其中一个进程是网上下载数据,一个进程是分析数据。如果是线程可以通过全局变量共享数据。如果是进程需要引入通信queue的get和put读写数据达到共享。
- 进程池pool:对进程管理,join阻塞主进程,等待进程池里面进程执行。进程池中如果有异常是不会在屏幕上打印的
2.4 协程
-
範囲とはxrangeの間の差、反復子によって返された結果に基づいて、前者、多くのスペースを占有し、後者は反復オブジェクトを返すことができ、ときに使用すると取ります。おおよその範囲のxrangeのは、省スペース性を改善した後のpython3が向上しました
-
結果イテレータは、識別収率リターン効果、及び高速動作が提供され、保存された次の反復は、コード制御結果を生成し実行します。
-
降伏マルチタスク
-
ピップpython2はPIP3のpythonの内側に取り付けられ、内部に取り付けられました
-
greenletはハイエンドパッケージの収率で、あなたはyeildを追加する必要はありません直接greenlet書くことができます。スイッチ機能を切り替えることにより、
- コルーチン方式を採用してgevent同時非同期ライブラリー。(推奨、収量とgreenletを理解することができます)
- gevent画像ダウンロードケース
2.5差分プロセス、スレッドとコルーチン
- プロセスは、リソース割当部は、オペレーティングシステムのスレッドスケジューリング手段であります
- プロセスの切り替えは、リソース、低効率の多くを取る;一般一般的には資源効率を切り替えるスレッド
- コルーチンタスク切り替えのリソースは、小型、高効率であります
- マルチプロセス、マルチスレッド、CPUコアの数に応じて、同時であってもよいが、プロセスがスレッドに協会によって複雑になります