国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python通過future處理并發問題

2020-02-16 10:24:20
字體:
來源:轉載
供稿:網友

future初識

通過下面腳本來對future進行一個初步了解:

例子1:普通通過循環的方式

import osimport timeimport sysimport requestsPOP20_CC = ( "CN IN US ID BR PK NG BD RU JP MX PH VN ET EG DE IR TR CD FR").split()BASE_URL = 'http://flupy.org/data/flags'DEST_DIR = 'downloads/'def save_flag(img,filename): path = os.path.join(DEST_DIR,filename) with open(path,'wb') as fp: fp.write(img)def get_flag(cc): url = "{}/{cc}/{cc}.gif".format(BASE_URL,cc=cc.lower()) resp = requests.get(url) return resp.contentdef show(text): print(text,end=" ") sys.stdout.flush()def download_many(cc_list): for cc in sorted(cc_list): image = get_flag(cc) show(cc) save_flag(image,cc.lower()+".gif") return len(cc_list)def main(download_many): t0 = time.time() count = download_many(POP20_CC) elapsed = time.time()-t0 msg = "/n{} flags downloaded in {:.2f}s" print(msg.format(count,elapsed))if __name__ == '__main__': main(download_many)

    例子2:通過future方式實現,這里對上面的部分代碼進行了復用

 from concurrent import futuresfrom flags import save_flag, get_flag, show, mainMAX_WORKERS = 20def download_one(cc): image = get_flag(cc) show(cc) save_flag(image, cc.lower()+".gif") return ccdef download_many(cc_list): workers = min(MAX_WORKERS,len(cc_list)) with futures.ThreadPoolExecutor(workers) as executor: res = executor.map(download_one, sorted(cc_list)) return len(list(res))if __name__ == '__main__': main(download_many)

    分別運行三次,兩者的平均速度:13.67和1.59s,可以看到差別還是非常大的。

future

future是concurrent.futures模塊和asyncio模塊的重要組件

從python3.4開始標準庫中有兩個名為Future的類:concurrent.futures.Future和asyncio.Future
這兩個類的作用相同:兩個Future類的實例都表示可能完成或者尚未完成的延遲計算。與Twisted中的Deferred類、Tornado框架中的Future類的功能類似

注意:通常情況下自己不應該創建future,而是由并發框架(concurrent.futures或asyncio)實例化

原因:future表示終將發生的事情,而確定某件事情會發生的唯一方式是執行的時間已經安排好,因此只有把某件事情交給concurrent.futures.Executor子類處理時,才會創建concurrent.futures.Future實例。
如:Executor.submit()方法的參數是一個可調用的對象,調用這個方法后會為傳入的可調用對象排定時間,并返回一個

future

客戶端代碼不能應該改變future的狀態,并發框架在future表示的延遲計算結束后會改變期物的狀態,我們無法控制計算何時結束。

這兩種future都有.done()方法,這個方法不阻塞,返回值是布爾值,指明future鏈接的可調用對象是否已經執行??蛻舳舜a通常不會詢問future是否運行結束,而是會等待通知。因此兩個Future類都有.add_done_callback()方法,這個方法只有一個參數,類型是可調用的對象,future運行結束后會調用指定的可調用對象。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广德县| 集贤县| 隆子县| 洪江市| 称多县| 广丰县| 云和县| 兴国县| 青州市| 涟水县| 内江市| 柳林县| 沾益县| 仙桃市| 文安县| 郑州市| 专栏| 郧西县| 张家界市| 阿鲁科尔沁旗| 彭泽县| 福泉市| 阿拉善左旗| 个旧市| 五大连池市| 台南市| 丰城市| 合作市| 华宁县| 综艺| 江陵县| 泸水县| 长治县| 威海市| 舟曲县| 古蔺县| 涪陵区| 中方县| 塔城市| 临洮县| 从江县|