Python threading/asyncio

多執行序範例

方法一:threading

import threading
import requests
from pyquery import PyQuery as pq


#宣告一個Threading並使用semaphore來控管執行數量( 最大值行數量 )
sema = threading.BoundedSemaphore(10)


# 定義一個函式進程
def ThreadSample( 參數1 , 參數2):
        print( 參數1 , 'Start')
        #放你要做的事...
        print( 參數1 , 'End') 
        #釋出threading Semaphore信號
        sema.release()
   

# 建立一個任務列表
ThreadTasks = []

for i in range(次數):
  #獲取threading Semaphore信號
  sema.acquire()
  #定義threading的內容(要執行的函示進程, 其函式所需參數[用List包起來] )
  thr = threading.Thread(target = ThreadSample , args = [參數1,參數2] )
  #把這thread任務先記起來
  ThreadTasks.append(thr)
  #開始執行threading任務
  thr.start()

for thr in ThreadTasks :
  #用此來控管threading
  thr .join()

 

方法二(推薦): asyncio

import asyncio
import requests
from pyquery import PyQuery as pq


#宣告一個semaphore來控管執行數量( value = 最大值行數量 )
sema = asyncio.Semaphore(value=10)
#建立一個Event Loop
loop = asyncio.get_event_loop()

# 定義一個函式進程
async def worker ( 參數1 , 參數2):
    async with sema:
        print( 參數1 , 'Start')
        # await loop 來執行 requests
        r = await loop.run_in_executor(None, requests.get, 參數2[參數1])
        #放你要做的事...
        print( 參數1 , 'End')    

# 建立一個任務列表
tasks = [ 
  asyncio.ensure_future( worker( 參數1 , 參數2 ))  
]

#開始執行
loop.run_until_complete(  asyncio.gather(*tasks)  )

#也可以用這個
loop.run_until_complete(  asyncio.wait(tasks) )

# await

創建一個新的「等待」命令,會確保其執行皆有回應(完成/出錯),才會再執行後續動作。可再使用.then語法來做後續連接

只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法
並注意,await 一定得運行在 async function 內
async function a(){
  await b();
  .....       // 等 b() 完成後才會執行
  await c();
  .....       // 等 c() 完成後才會執行
}
a();
a().then(()=>{
  .....       // 等 a() 完成後接著執行
});

資料參考:

https://kknews.cc/zh-tw/code/4vvverq.html
https://kknews.cc/code/4vvverq.html

 


人生美好~別浪費腦容量記程式碼 :- ) 

作者:CYL
出處:http://dotblogs.com.tw/cylcode
資料來源都會特別註明,有興趣都可查詢原出處,本站皆經過整理才分享,如有轉載請顯示出處及作者,感謝。