python 3コヒーレンス

2275 ワード

pythonスレッドマルチコンカレントとは、1つのプロセスでnスレッドを開き、コンカレント実行タスクを達成することを意味します.しかしpythonのスレッドにはGIL解釈ロックがあり、同じ時間に1つのスレッドしか実行できません.マルチスレッドの同時実行は、複数のスレッドがタスクを実行するために切り替えることです.スレッドが少ないと影響はありませんが、開いているスレッドが特に多いと、スレッドの切り替えにリソースがかかりすぎて、所望のマルチスレッド同時効果に達しません.個人的な観点(pythonのスレッドは少し鶏の肋骨がある).
pythonコヒーレンス、最近しばらくの間コヒーレンスに接触して、コヒーレンスがスレッドに取って代わって高い同時性のタスクを行うことができることを発見しました
まず、コヒーレンスの動作原理を説明します.ジェネレータのように、自分のコンテキストにアクセスするスタックがあります.IO操作に遭遇するたびに保留され、一時停止に相当し、データの戻りを待ち、待機時間に別のタスクを実行し、タスクの切り替えを達成する.また,コヒーレンスは単一スレッド内で実行されるため,タスクの切り替えにリソースがかからず,マルチスレッドに比べて効率が高い.
接触コヒーレンスからpython 3.6ベースのコヒーレンスを研究してきたが,3.6でのコヒーレンスは以前とは異なり,構文をカスタマイズした.
        async def function():
    .......
これにより、パスを定義した関数ですが、切り替えの目的を達成するにはawaitのキーワードが必要です.例:async def test():
await asyncio.sleep(2)
これが完全なコヒーレンス関数です.この関数を実行するとawaitというキーワードに出会うと、この関数は保留され、別のタスクを実行します.
コンボの実行は面倒で、まず1つのループイベントを得る必要があります.中は無限のループに相当します.コンボはこのループイベントでimport asyncio newを実行するしかありません.loop = asyncio.new_event_loop()#ループイベントを取得
new_loop.run_until_complete(function()#実行する関数を入れます
これにより、テストを実行できます.
簡単に言って、私が書いたdemoを置いてください.爬虫類用
      import asyncio
	import aiohttp
	import time

	HEADERS = {
	    'User-Agent': "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
	    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
	    'Accept-Language': 'en-US,en;q=0.5',
	    'Accept-Encoding': 'gzip, deflate',
	}

	urls = 'https://sh.lianjia.com/ershoufang/pg{}/'
	num = 100


	async def get(url):
	    async with aiohttp.ClientSession() as session:
	        async with session.get(url, headers=HEADERS) as response:
	            bytes = await response.read()
	            bytes = bytes.decode('utf-8')  #        await response.read().bytes.decode('utf-8')                      
	            print(bytes)
	            return


	async def main():
	    url_list = [urls.format(i) for i in range(num)]
	    task = []
	    for url in url_list:
	        task.append(get(url))
	    await asyncio.gather(*task)


	a = time.time()
	new_loop = asyncio.new_event_loop()
	new_loop.run_until_complete(main())
	print(time.time() - a)