Pythonはconcurrent.futuresとasyncicoの例を合併します。


説明
Python標準ライブラリは、対応するマルチスレッド/マルチプロセスコードを作成するために、threadingとmultiprocessingモジュールを提供しています。
Python 3.2から、標準倉庫は私達にconcurrent.futuresモジュールを提供してくれました。concurrent.futuresモジュールの主な特徴はThreadPool Exectorと
ProcessPool Exectorクラスでは、これらの2つのクラスが実装するインターフェースは、それぞれ異なるスレッドまたはプロセスで調整可能である。
使用するオブジェクト。これらの2つのクラスは、作業スレッドまたはプロセスプールを内部で維持し、実行するタスクのキューです。
Python 3.4以降の標準ライブラリの中でasyncicoパッケージは、このパッケージはイベントサイクル駆動の協働を使って合併を実現します。これはPythonの中で一番大きいものです。
最も野心的なライブラリの一つです。asyncicoはyield from表現を大量に使っていますので、
Pythonの旧版は互換性がない。
submitとmapの方法
submit法の役割は、スレッド池にフィードバック可能なtaskを提出し、フィードバック例を返すことである。
example:

import time
from concurrent.futures import ThreadPoolExecutor

#     task
def pub_task(msg):
  time.sleep(3)
  return msg

#        
pool = ThreadPoolExecutor(max_workers=3)

#       2 task
task1 = pool.submit(pub_task, 'a')
task2 = pool.submit(pub_task, 'b')

print(task1.done())    # False
time.sleep(4)
print(task2.done())    # True

print(task1.result())
print(task2.result())
map方法は、ディエゼルを作成し、リピートの結果は、順序良くローズマリーに配置されます。
問題:
Exector.map関数は使いやすいですが、機能がありますので、役に立たないかもしれません。具体的な状況は必要に応じます。この関数の戻り値の順番は呼び出しの開始順と一致します。
最初の呼び出しが発生した場合は10秒、他の呼び出しが1秒しかかからない場合は、コードは10秒ブロックされ、map方法で返された生成器から最初の結果が得られます。
その後、後続の結果を取得すると、後続の呼び出しが終了したため、ブロックされません。
もしすべての結果を得てから処理しなければならないなら、このような行為は大丈夫です。しかし、通常より好ましい方法は、提出の順序にかかわらず、結果があれば取得することである。
そのためには、Exector.submit方法とfutures.as_completteed関数を結合して使用します。

from concurrent.futures import ThreadPoolExecutor
import requests

URLS = ['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 ThreadPoolExecutor
from concurrent.futures import as_completed
import requests

URLS = ['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))
asyncicoライブラリ協働のプロセスが同時に実現される。
geventとasyncicoについては、Geventを放棄し、asyncicoを抱擁し、asyncicoはPython 3.4以降の標準ライブラリです。
また、Geventは直接に標準ライブラリ内の大部分のブロックシステム呼び出しを修正して、socket、ssl、threading、selectなどのモジュールを含み、提携式になって運行します。
しかし、あなたが複雑な生産環境の中でどのようなところでこれらの標準ライブラリを使うかは保証できません。パッチを適用したことによって、おかしい問題が発生します。

import asyncio
import time
start = 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でしかキャンセルできないので、Cacell ledErr異常を処理して、清掃作業を実行することができます。
補足知識:Python-いつyieldを使いますか?
概要
多くの場合、pythonコードの中でyieldを見ました。システムを勉強したことがなく、自分も使ったことがありません。
yield文はステートメントの実行を遅延させ、調整者に値を送信しましたが、一定の状態を保持して関数を残してから続けます。継続すると、関数は前の運転状態を続行します。これにより、コードは時間とともに一連の値を生成し、即時に実行するのではなく、リストのように彼らを送って帰ってきます。

例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のジェネレータに使用されます。一つのgeneranttorは普通の関数のように見えるように定義されていますが、returnを使用するのではなく、1つの数字を生成する必要があります。関数の中に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とasyncicoの例を合併しました。小編集は皆さんに提供した内容を全部共有しています。参考にしてもらいたいです。どうぞよろしくお願いします。