电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python并發concurrent.futures和asyncio實例

瀏覽:2日期:2022-07-26 14:06:35

說明

Python標準庫為我們提供了threading和multiprocessing模塊編寫相應的多線程/多進程代碼。

從Python3.2開始,標準庫為我們提供了concurrent.futures模塊,concurrent.futures 模塊的主要特色是 ThreadPoolExecutor 和

ProcessPoolExecutor 類,這兩個類實現的接口能分別在不同的線程或進程中執行可調

用的對象。這兩個類在內部維護著一個工作線程或進程池,以及要執行的任務隊列。

Python 3.4 以后標準庫中asyncio 包,這個包使用事件循環驅動的協程實現并發。這是 Python 中最大也

是最具雄心壯志的庫之一。asyncio 大量使用 yield from 表達式,因此與

Python 舊版不兼容。

submit和map方法

submit方法作用是向線程池提交可回調的task,并返回一個回調實例。

example:

import timefrom concurrent.futures import ThreadPoolExecutor# 可回調的taskdef pub_task(msg): time.sleep(3) return msg# 創建一個線程池pool = ThreadPoolExecutor(max_workers=3)# 往線程池加入2個tasktask1 = pool.submit(pub_task, ’a’)task2 = pool.submit(pub_task, ’b’)print(task1.done()) # Falsetime.sleep(4)print(task2.done()) # Trueprint(task1.result())print(task2.result())

map方法是創建一個迭代器,回調的結果有序放在迭代器中。

問題:

Executor.map 函數易于使用,不過有個特性可能有用,也可能沒用,具體情況取決于需求:這個函數返回結果的順序與調用開始的順序一致。

如果第一個調用生成結果用時 10秒,而其他調用只用 1 秒,代碼會阻塞 10 秒,獲取 map 方法返回的生成器產出的第一個結果。

在此之后,獲取后續結果時不會阻塞,因為后續的調用已經結束。

如果必須等到獲取所有結果后再處理,這種行為沒問題;不過,通常更可取的方式是,不管提交的順序,只要有結果就獲取。

為此,要把 Executor.submit 方法和 futures.as_completed 函數結合起來使用。

from concurrent.futures import ThreadPoolExecutorimport requestsURLS = [’http://www.csdn.com’, ’http://qq.com’, ’http://www.leasonlove.cn’]def task(url, timeout=10): return requests.get(url, timeout=timeout)pool = ThreadPoolExecutor(max_workers=3)results = pool.map(task, URLS)for ret in results: print(’%s, %s’ % (ret.url, ret))

future異步編程

Future可以理解為一個在未來完成的操作,這是異步編程的基礎。通常情況下,我們執行io操作,訪問url時(如下)在等待結果返回之前會產生阻塞,cpu不能做其他事情,而Future的引入幫助我們在等待的這段時間可以完成其他的操作。

from concurrent.futures import ThreadPoolExecutorfrom concurrent.futures import as_completedimport requestsURLS = [’http://www.csdn.cn’, ’http://qq.com’, ’http://www.leasonlove.cn’]def task(url, timeout=1): return requests.get(url, timeout=timeout)with ThreadPoolExecutor(max_workers=3) as executor: future_tasks = [executor.submit(task, url) for url in URLS] for f in future_tasks: if f.running(): print(’%s is running’ % str(f)) for f in as_completed(future_tasks): try: ret = f.done() if ret:f_ret = f.result()print(’%s, done, result: %s, %s’ % (str(f), f_ret.url, f_ret.content)) except Exception as e: # 第一個url無響應 f.cancel() print(str(e))

asyncio庫協程實現并發

對于gevent 和 asyncio 建議大家放棄Gevent,擁抱asyncio,asyncio是Python3.4以后標準庫。

而且由于Gevent直接修改標準庫里面大部分的阻塞式系統調用,包括socket、ssl、threading和 select等模塊,而變為協作式運行。

但是我們無法保證你在復雜的生產環境中有哪些地方使用這些標準庫會由于打了補丁而出現奇怪的問題。

import asyncioimport timestart = time.time()async def do(x): print(’Waiting: ’, x) await asyncio.sleep(x) return ’Finish after {}s’.format(x)task1 = do(1)task2 = do(2)task3 = do(4)tasks = [ asyncio.ensure_future(task1), asyncio.ensure_future(task2), asyncio.ensure_future(task3)]loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.wait(tasks))for task in tasks: print(’Task result: ’, task.result())end = time.time()print(’TIME: ’, end - start)

協程與線程

如果使用線程做過重要的編程,你就知道寫出程序有多么困難,因為調度程序任何時候都能中斷線程。

必須記住保留鎖,去保護程序中的重要部分,防止多步操作在執行的過程中中斷,防止數據處于無效狀態。

而協程默認會做好全方位保護,以防止中斷。我們必須顯式產出才能讓程序的余下部分運行。

對協程來說,無需保留鎖,在多個線程之間同步操作,協程自身就會同步,因為在任意時刻只有一個協程運行。

想交出控制權時,可以使用 yield 或 yield from 把控制權交還調度程序。

這就是能夠安全地取消協程的原因:按照定義,協程只能在暫停的 yield處取消,因此可以處理 CancelledError 異常,執行清理操作。

補充知識:Python-什么時候使用yield?

簡介

很多時候在python代碼中見到了yield,沒有系統學習過,自己也沒有用過。

yield語句延遲了語句的執行,然后發送了一個值給調用者,但保留了一定的狀態去保證函數離開之后可以繼續。當繼續的時候,函數繼續執行上一個的運行狀態。這使得它的代碼可以隨著時間產生一系列的值,而不是立即執行,然后像一個list一樣發送他們回來。

例子

例子1:

# A Simple Python program to demonstrate working # of yield # A generator function that yields 1 for first time, # 2 second time and 3 third time def simpleGeneratorFun(): yield 1 yield 2 yield 3 # Driver code to check above generator function for value in simpleGeneratorFun(): print(value)

返回語句發送一個特殊的值給它的調用者,而yield產生了一系列的值,當我們想要遍歷一個序列的時候,我們應該使用yield,但不想要把整個序列存儲在內存中。

yield用于python的生成器(generator)。一個genertator 被定義得看起來像一個普通函數一樣,但它需要產生一個數字得時候,它使用yield,而不是使用return。如果一個函數里面定義了yield,那么它自動稱為了一個generator函數。、

例子2:

# A Python program to generate squares from 1 # to 100 using yield and therefore generator # An infinite generator function that prints # next square number. It starts with 1 def nextSquare(): i = 1; # An Infinite loop to generate squares while True: yield i*i i += 1 # Next execution resumes # from this point # Driver code to test above generator # function for num in nextSquare(): if num > 100: break print(num)

輸出1,4,9…100

以上這篇Python并發concurrent.futures和asyncio實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 北京康百特科技有限公司-分子蒸馏-短程分子蒸馏设备-实验室分子蒸馏设备 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 齿轮减速马达一体式_蜗轮蜗杆减速机配电机-德国BOSERL齿轮减速电动机生产厂家 | 权威废金属|废塑料|废纸|废铜|废钢价格|再生资源回收行情报价中心-中废网 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 半自动预灌装机,卡式瓶灌装机,注射器灌装机,给药器灌装机,大输液灌装机,西林瓶灌装机-长沙一星制药机械有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 万烁建筑设计院-建筑设计公司加盟,设计院加盟分公司,市政设计加盟 | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 云南标线|昆明划线|道路标线|交通标线-就选云南云路施工公司-云南云路科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 棕刚玉_白刚玉_铝酸钙-锐石新材料 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 广东高华家具-公寓床|学生宿舍双层铁床厂家【质保十年】 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | Dataforth隔离信号调理模块-信号放大模块-加速度振动传感器-北京康泰电子有限公司 | 罗氏牛血清白蛋白,罗氏己糖激酶-上海嵘崴达实业有限公司 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 |