各種模組:
from gevent import monkey;monkey.patch_all()
import time
from gevent import spawn
import select
from multiprocessing import process,semaphore,rlock,event,joinablequeue
from threading import thread,semaphore,event,rlock
import queue
from concurrent.futures import processpoolexecutor,threadpoolexecutor
pool1 = processpoolexecutor()
pool2 = threadpoolexecutor()
a = queue.queue()
b = queue.lifoqueue()
c = queue.priorityqueue()
d = joinablequeue()
x = semaphore(5)
e = event()
def task(tt):
print(tt) # tt 普通引數
x.acquire()
# print(1)
# time.sleep(2)
x.release()
# e.set()
return 'ok'
# typeerror: task1() takes 0 positional arguments but 1 was given
def task1(t):
print(t) # print(t.result()) # ok 返回的是提交程序,的結果;也就是說 add_done_callback 裡的方法名,預設第乙個引數是future 物件,,,
# 即task這個任務提交之後的返回的物件。也就是說,這個add_done_callback是個物件方法。self。。。
# e.wait()
print('wl')
if __name__ == '__main__':
# for i in range(20):
# t1 = thread(target=task)
# t1.start()
# t2 = thread(target=task1)
# t2.start()
for i in range(20):
pool2.submit(task,i).add_done_callback(task1) # submit 提交
if i == 10:
pool2.shutdown() # runtimeerror: cannot schedule new futures after shutdown 關閉執行緒池,迴圈並沒有結束,會再次提交任務,所以,要break
break
"""非同步提交
gevent模組本身無法檢測常見的一些io操作
在使用的時候需要你額外的匯入一句話
from gevent import monkey
monkey.patch_all()
又由於上面的兩句話在使用gevent模組的時候是肯定要匯入的
所以還支援簡寫
from gevent import monkey;monkey.patch_all()
"""# def heng():
# print('哼')
# time.sleep(2)
# print('哼')##
# def ha():
# print('哈')
# time.sleep(3)
# print('哈')
## def heiheihei():
# print('heiheihei')
# time.sleep(5)
# print('heiheihei')##
# start_time = time.time()
# g1 = spawn(heng).join()
# g2 = spawn(ha)
# g3 = spawn(heiheihei)
# # g1.join()
# # g2.join() # 等待被檢測的任務執行完畢 再往後繼續執行
# # g3.join()
# # heng()
# # ha()
# # print(time.time() - start_time) # 5.005702018737793
# print(time.time() - start_time) # 3.004199981689453 5.005439043045044
多路復用io:
"""
當監管的物件只有乙個的時候 其實io多路復用連阻塞io都比比不上!!!
但是io多路復用可以一次性監管很多個物件
server = socket.socket()
conn,addr = server.accept()
監管機制是作業系統本身就有的 如果你想要用該監管機制(select)
需要你匯入對應的select模組
"""import socket
import select
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(false)
read_list = [server]
while true:
r_list, w_list, x_list = select.select(read_list, , )
"""幫你監管
一旦有人來了 立刻給你返回對應的監管物件
一開始只監管server,當有客戶端連線,被監管的server,有了回應,所以返回的r_list中有server
新增連線物件到read_list,增加了乙個監管的物件。當連線物件,有傳送資料,那麼,檢測到了結果,返回的r_list,就有了連線物件。
也就是說被監管的物件,哪個有結果回應,就新增到r_list中,從而程式往下執行。
當連線斷開時,也是一種結果,收到的資訊為空。
"""# print(res) # (, , )
# print(server)
# print(r_list)
print(read_list)
print(r_list,w_list,x_list) # r_list 一開始只有server,有了連線物件之後,只有連線物件。
for i in r_list: #
"""針對不同的物件做不同的處理"""
if i is server:
conn, addr = i.accept()
# 也應該新增到監管的佇列中
print('111111111')
else:
res = i.recv(1024)
if len(res) == 0:
i.close()
# 將無效的監管物件 移除
read_list.remove(i)
print(res) # b''
continue
print(res)
i.send(b'heiheiheiheihei')
網路程式設計之各種協議
在網路程式設計 時有各種協議,多的眼花繚亂,學著也容易混淆,特意整理一下,方便查閱 arp 位址解析協議,就是把ip位址和mac位址對應起來的,當網路中乙個ip位址沒有與之相對應的mac位址時,arp可以在網路中找到與之相對應的主機mac位址。ip在osi模型的網路層,mac在資料鏈路層,他倆彼此互...
使用requests模組的網路程式設計
python操作網路,也就是開啟乙個 或者請求乙個http介面,本篇是介紹使用request模組的使用方式。在使用requests模組之前需要先安裝,在cmd中輸入 pip install requests 即可。以下是各種介面的訪問操作 1 發get請求 1 url 介面的url 2 data 請...
Python socket模組實現網路程式設計
osi七層結構 應用表示 會話傳輸 傳輸層一tcp udp 網路 ip位址 資料鏈路 mac位址 物理層傳輸方式 tcp ip 安全的傳輸 udp 不安全傳輸 socket流程圖 socket是在應用層和傳輸層之間的乙個抽象層,它把tcp ip層複雜的操作抽象為幾個簡單的介面 用層呼叫已實現程序在網...