'''from concurrent.futures import threadpoolexecutor,processpoolexecutor
import time,random,os
def task(name,n):
print('%s%s is running' %(name,os.getpid()))
time.sleep(random.randint(1,3))
return n**2
if __name__ == '__main__':
# print(os.cpu_count())
p=processpoolexecutor(4)
#提交任務的兩種方式:
# 同步呼叫:提交完乙個任務之後,就在原地等待,等待任務完完整整地執行完畢拿到結果後,再執行下一行**,會導致任務是序列執行的
# 非同步呼叫:提交完乙個任務之後,不在原地等待,結果???,而是直接執行下一行**,會導致任務是併發執行的
l=for i in range(10):
# 同步提交
# res=p.submit(task,'程序pid: ',i).result()
# print(res)
# 非同步提交
future=p.submit(task,'程序pid: ',i)
p.shutdown(wait=true) #關閉程序池的入口,並且在原地等待程序池內所有任務執行完畢
for future in l:
print(future.result())
print('主')
''''''
from concurrent.futures import threadpoolexecutor,processpoolexecutor
import time,random,os
import requests
def get(url):
print('%s get %s' %(os.getpid(),url))
time.sleep(3)
response=requests.get(url)
if response.status_code == 200:
res=response.text
else:
parse(res)
def parse(res):
time.sleep(1)
print('%s 解析結果為%s' %(os.getpid(),len(res)))
if __name__ == '__main__':
urls=[
'','',
'','',
'','',
'','',
'',]
p=processpoolexecutor(9)
l=start=time.time()
for url in urls:
future=p.submit(get,url)
p.shutdown(wait=true)
print('主',time.time()-start)
''''''
from concurrent.futures import threadpoolexecutor,processpoolexecutor
import time,random,os
import requests
def get(url):
print('%s get %s' %(os.getpid(),url))
time.sleep(3)
response=requests.get(url)
if response.status_code == 200:
res=response.text
else:
return res
def parse(future):
time.sleep(1)
res=future.result()
print('%s 解析結果為%s' %(os.getpid(),len(res)))
if __name__ == '__main__':
urls=[
'','',
'','',
'','',
'','',
'',]
p=processpoolexecutor(9)
start=time.time()
for url in urls:
future=p.submit(get,url)
# 非同步呼叫:提交完乙個任務之後,不在原地等待,而是直接執行下一行**,會導致任務是併發執行的,,結果futrue物件會在任務執行完畢後自動傳給**函式
future.add_done_callback(parse) #parse會在任務執行完畢後自動觸發,然後接收乙個引數future物件
p.shutdown(wait=true)
print('主',time.time()-start)
print('主',os.getpid())
'''from concurrent.futures import
threadpoolexecutor,processpoolexecutor
from threading import
current_thread
import
time,random,os
import
requests
defget(url):
print('
%s get %s
' %(current_thread().name,url))
time.sleep(3)
response=requests.get(url)
if response.status_code == 200:
res=response.text
else
: res='
'return
resdef
parse(future):
time.sleep(1)
res=future.result()
print('
%s 解析結果為%s
' %(current_thread().name,len(res)))
if__name__ == '
__main__':
urls=[
'','',
'','',
'','',
'','',
'',]
p=threadpoolexecutor(4)
start=time.time()
for url in
urls:
future=p.submit(get,url)
future.add_done_callback(parse)
p.shutdown(wait=true)
print('
主',current_thread().name,time.time()-start)
執行緒池和程序池
動態建立程序 或執行緒 是比較耗費時間的,這樣導致較慢的客戶響應。動態建立的子程序 子執行緒 通常只用來為乙個客戶服務,這將導致系統上產生大量的細微程序 或執行緒 程序間的切換將消耗大量的cpu時間。動態建立的子程序是當前程序的完整映像,當前程序必須謹慎地管理其分配的檔案描述符和堆記憶體等系統資源,...
執行緒池和程序池
案例 模擬多個客戶端一同去訪問服務端,讓服務端支援多個客戶端訪問,從而實現併發效果 不考慮粘包問題 import socket from threading import thread server socket.socket def communicate conn 開始通訊 while true...
程序池和執行緒池
系統啟動乙個新執行緒的成本是比較高的,因為它涉及與作業系統的互動。在這種情形下,使用執行緒池可以很好地提公升效能,尤其是當程式中需要建立大量生存期很短暫的執行緒時,更應該考慮使用執行緒池。執行緒池在系統啟動時即建立大量空閒的執行緒,程式只要將乙個函式提交給執行緒池,執行緒池就會啟動乙個空閒的執行緒來...