小知识点
python中无块级作用域,是以函数为作用域
#python中无块级作用域
if 1==1:
name = 'alex'
print(name)
for i in range(10):
name =i
print(name)
#python 中以函数为作用域
def func():
name = 'alex'
func()
print(name)
python的作用域在执行之前已经确定。
#python的作用域在执行之前已经确定
name = 'alex'
def f1():
print(name)
def f2():
name = 'eric'
f1()
f2()
作用链
li = [lambda :x for x in range(10)]
r = li [0]()
print(r)
li为列表
li列表中的元素:【函数,函数,函数 ...】
函数在没有执行前 ,内部代码不执行.
socket
IO多路复用
概述
select , poll , epoll
监听 socket 对象内部是否变化了?链接或者收发消息会发生变化
socket实现伪并发
socket服务器端
import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',999,))
sk.listen(5)
inputs = [sk,]
while True:
rlist,w,e = select.select([sk,],[],[],1)
#print(rlist)
print(len(inputs),len(rlist))
#监听sk(服务器端)对象,如果sk对象发生变化,表示 有客户端来连接了,此时rlist值为 【sk】
# 监听conn对象,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的之为 【客户端】
for r in rlist:
if r == sk:
#新客户来连接
conn,address = r.accept()
#conn是什么?其实socket对象
inputs.append(conn)
conn.sendall(bytes('hello',encoding='utf-8'))
else:
print('======>')
try:
ret = r.recv(1024)
if not ret:
raise Exception('断开连接')
except Exception as e:
inputs.remove(r)
socket读写分离
服务器端
import socket
import select
sk = socket.socket()
sk.bind(('127.0.0.1',999,))
sk.listen(5)
inputs = [sk,]
outputs = []
while True:
rlist,wlist,e = select.select(inputs,outputs,[],1)
#print(rlist)
print(len(inputs),len(rlist),len(wlist),len(outputs))
#监听sk(服务器端)对象,如果sk对象发生变化,表示 有客户端来连接了,此时rlist值为 【sk】
# 监听conn对象,如果conn发生变化,表示客户端有新消息发送过来了,此时rlist的之为 【客户端】
for r in rlist:
if r == sk:
#新客户来连接
conn,address = r.accept()
#conn是什么?其实socket对象
inputs.append(conn)
conn.sendall(bytes('hello',encoding='utf-8'))
else:
#r.recv(1024)
print('======>')
try:
ret = r.recv(1024)
if not ret:
raise Exception('断开连接')
else:
outputs.append(r)
except Exception as e:
inputs.remove(r)
for w in wlist:
w.sendall(bytes('response',encoding='utf-8'))
outputs.remove(w)
socket客户端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",999,))
data = sk.recv(1024)
print(data)
while True:
inp = input('>>>>')
sk.sendall(bytes(inp,encoding='utf-8'))
sk.close()
多线程 多进程
概述:
def f1(arg):
print(arg)
import threading
t = threading.Thread(target =f1,args=(123,))
t.setDaemon(True)#true,表示主线程不等子线程
t.start() #不代表当前线程会被立即执行
t.join(2) # 表示主线程到此,等待..直到子线程执行完毕
#参数,表示主线程在此最多等待n秒
f1(1111)