研究ノート(34):Pythonのネットワークプログラミング&並行プログラミング - 非同期呼び出しとコールバックメカニズム

すぐに学ぶ:https://edu.csdn.net/course/play/24458/296452?utm_source=blogtoedu

1.知識:(詳細なソース・ノートを参照してください)

1)同期呼び出し:

RES1 = pool.submit(チュ 'john1')。結果()

2)非同期呼び出し

pool.submit(チュ、 'john1')

3)両者の差を

非同期呼び出し:ちょうど、タスクが所定の位置に結果を待つことができない提出直後に次のコードを実行します。
同期呼び出しは:あなたはまだ結果を待って、あなたのタスクを送信した後、シリアル効果で実行されるコードの背後にあるコードの実装の結果まで待ちます

4)非同期コールバック機構

#コールバックメカニズム:非同期呼び出しの結果を待ちませんが、結果はまた、concurrent.futuresオブジェクトを取得するためのコールバック機構を介して、ここで得ることができ、あなたは(必要).resultでデータを取得します

5)差の妨害と同期

待機へのI / Oまたは数値計算が必要かどうか同期呼び出し、ブロッキングが唯一のI / Oの場合に発生している間

2.同期呼び出し:同期呼び出しのいずれかのI / Oまたは待機に計算集約型の必要性、ブロッキングが唯一のI / Oの場合に発生している間

#同步与异步调用都是提交任务的一种方式,以举重最例

#同步调用:提交完任务后,在原地等待结果,等到结果后再执行后面的代码,代码运行的效果呈串行
from concurrent.futures import ProcessPoolExecutor
import time,random

#创建函数模拟举重的任务
def ju(name):
    print('%s is juing'%name)
    #举重的时间
    time.sleep(random.randint(2,3))
    #举重的重量
    res = random.randint(4,8)
    return {'name':name,'res':res}

#创建函数模拟提交举重结果的事件
def weight(response):
    name = response['name']
    size = response['res']
    print('%s 举重的重量是《%s》kg'%(name,size))

if __name__ == '__main__':
    #创建进程池
    pool = ProcessPoolExecutor(5)
    #提交任务,此处使用同步调用result(),得到函数返回的结果
    res1 = pool.submit(ju,'john1').result()
    weight(res1)
    res2 = pool.submit(ju,'john2').result()
    weight(res2)
    res3 = pool.submit(ju,'john3').result()
    weight(res3)

同期呼び出しの結果

X:\Users\13711\AppData\Local\Programs\Python\Python37\python.exe C:/Users/jinlin/Desktop/python_further_study/并发编程/异步调用与回调机制.py
john1 is juing
john1 举重的重量是《7》kg
john2 is juing
john2 举重的重量是《8》kg
john3 is juing
john3 举重的重量是《7》kg

进程已结束,退出代码0

2.非同期呼び出し

#异步调用:只是提交了任务即可,不会在原地等待结果,马上运行下面的代码
#回调机制:异步调用不会等待结果,但是也可获得结果,这里通过回调机制,来获得一个concurrent.futures对象,需要通过.result()来获得数据
from concurrent.futures import ProcessPoolExecutor
import time,random

#创建函数模拟举重的任务
def ju(name):
    print('%s is juing'%name)
    #举重的时间
    time.sleep(random.randint(2,3))
    #举重的重量
    res = random.randint(4,8)
    return {'name':name,'res':res}

#创建函数模拟提交举重结果的事件
def weight(response):
    response = response.result()
    name = response['name']
    size = response['res']
    print('%s 举重的重量是《%s》kg'%(name,size))

if __name__ == '__main__':
    #创建进程池
    pool = ProcessPoolExecutor(5)
    #提交任务,此处使用异步调用,不得到函数返回的结果,使用回调函数add_done_callback(回调函数)来得到一个对象
    pool.submit(ju,'john1').add_done_callback(weight)
    pool.submit(ju,'john2').add_done_callback(weight)
    pool.submit(ju,'john3').add_done_callback(weight)

非同期呼び出しの結果

X:\Users\13711\AppData\Local\Programs\Python\Python37\python.exe C:/Users/jinlin/Desktop/python_further_study/并发编程/异步调用与回调机制.py
john1 is juing
john2 is juing
john3 is juing
john1 举重的重量是《5》kg
john2 举重的重量是《4》kg
john3 举重的重量是《5》kg

进程已结束,退出代码0

 

公開された49元の記事 ウォン称賛11 ビュー565

おすすめ

転載: blog.csdn.net/qq_45769063/article/details/105114489