ホームページ > バックエンド開発 > PHPチュートリアル > 非同期コルーチン開発ガイド: 高性能レコメンデーション システムの構築

非同期コルーチン開発ガイド: 高性能レコメンデーション システムの構築

WBOY
リリース: 2023-12-17 15:34:02
オリジナル
1361 人が閲覧しました

非同期コルーチン開発ガイド: 高性能レコメンデーション システムの構築

インターネットやモバイルインターネットの急速な発展に伴い、データ量が爆発的に増加し、データをいかに効率的に処理するかが大手企業の研究開発チームにとって重要な課題となっています。レコメンデーション システムは主要なアプリケーション分野の 1 つであり、多くの企業で広く使用されています。非同期コルーチンは、同時実行性の高いシナリオで高性能のデータ処理を実現するための重要なテクノロジです。この記事では、非同期コルーチンを使用して高性能のレコメンデーション システムを構築する方法と、具体的なコード例を紹介します。

1. 非同期コルーチンとは何ですか?

非同期コルーチンは、非常に効率的な同時プログラミング モデルです。もともと Python 言語によって提案され、実装されました。Go 言語の goroutine、Swift の SwiftNIO など、多くの言語で借用され、開発されてきました。 。非同期コルーチンは、コルーチン レベルで切り替えることにより、高度な同時非同期 I/O 操作をサポートします。

マルチスレッドと比較すると、非同期コルーチンには次の利点があります。

  1. より効率的: 非同期コルーチンは、スイッチング オーバーヘッドがほとんどなく、非常に軽量なスレッド モデルを実装できます。
  2. より柔軟: コルーチン間の切り替えはカーネルに入る必要はなく、プログラムによって制御されるため、コルーチンの数とスケジューリング方法をより柔軟に制御できます。
  3. より使いやすい: マルチスレッドのロック メカニズムと比較して、非同期コルーチンは協調的なスケジューリングを通じてロックなどのマルチスレッドの問題を回避できるため、コードがよりシンプルで使いやすくなります。

2. レコメンデーション システムにおける非同期コルーチン アプリケーション シナリオ

レコメンデーション システムは、実装プロセス中にユーザーの行動ログ、アイテムの属性情報、など、非同期コルーチンにより高性能なデータ処理を実現できます。具体的には、レコメンデーション システムの次のアプリケーション シナリオは、非同期コルーチンの使用に適しています。

  1. ユーザーの関心の特徴抽出: ユーザーの行動ログの非同期の読み取りと処理は、ユーザーの関心を抽出するために、非同期コルーチンを通じて実装されます。機能、パーソナライズされた推奨事項をサポートします。
  2. アイテム情報集約:非同期コルーチンによりアイテム属性情報の非同期読み取り・処理を実現し、様々な情報を集約してアイテムの総合的なレコメンドをサポートします。
  3. レコメンデーション結果の並べ替え: レコメンデーション結果の迅速な並べ替えとフィルター処理は、レコメンデーション システムの高スループットと低レイテンシを確保するために、非同期コルーチンを通じて実装されています。

3. 非同期コルーチン開発ガイド

以下では、コルーチン開発プロセス、スケジューリング機構、非同期 I/O 操作の 3 つの側面から非同期コルーチンの開発ガイドを紹介します。

  1. コルーチン開発プロセス

非同期コルーチンでは、コルーチンの作成、切り替え、スケジューリングを実現するためにコルーチン ライブラリを使用する必要があります。現在、より一般的なコルーチン ライブラリには、Python の asyncio、Go の goroutine、Swift の SwiftNIO などがあります。

簡単な非同期コルーチン プログラムを実装するための例として、Python の asyncio を取り上げます。

import asyncio

async def foo():
    await asyncio.sleep(1)
    print('Hello World!')

loop = asyncio.get_event_loop()
loop.run_until_complete(foo())
ログイン後にコピー

上記のプログラムでは、asyncio.sleep(1) は、現在のcoroutine プロセスは、非同期 I/O 操作をシミュレートするために 1 秒間スリープします。async def で宣言された関数は、非同期関数を表します。プログラム内で loop.run_until_complete() を使用してコルーチンを実行すると、出力結果は Hello World! になります。

  1. スケジューリング メカニズム

非同期コルーチンでは、コルーチンのスケジューリングは非常に重要な部分です。非同期コルーチンの協調スケジューリングにより、コルーチンの数とスケジューリング順序をより柔軟に制御して、最適なパフォーマンスを実現できます。

asyncio では、asyncio.gather() メソッドを使用して複数のコルーチンを実行します。例:

import asyncio

async def foo():
    await asyncio.sleep(1)
    print('foo')

async def bar():
    await asyncio.sleep(2)
    print('bar')

loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(foo(), bar()))
ログイン後にコピー

上記のプログラムでは、asyncio.gather( ) は複数のコルーチンを同時に実行でき、出力結果は foobar です。ここでの 2 つのコルーチンの時間の長さはそれぞれ 1 秒と 2 秒であるため、出力シーケンスは foobar になります。

  1. 非同期 I/O 操作

レコメンド システムでは、大量のユーザー行動ログやアイテムの属性情報を処理するために、非同期 I/O 操作を使用する必要があります。およびその他のデータ。非同期コルーチンで非同期 I/O 操作を使用すると、データの読み取りと処理の効率が大幅に向上します。

asyncio では、asyncio.open() メソッドを使用してファイルを非同期的に読み取ります。例:

import asyncio

async def read_file():
    async with aiofiles.open('data.log', 'r') as f:
        async for line in f:
            print(line.strip())

loop = asyncio.get_event_loop()
loop.run_until_complete(read_file())
ログイン後にコピー

上記のプログラムでは、async を aiofiles で使用します。 .open() を使用してファイルを非同期的に開き、async for line in f を使用してファイル内のデータの各行を非同期的に読み取ります。コルーチンを実行するには、プログラム内で loop.run_until_complete() を使用します。

4. 具体的なコード例

推奨システムにおける非同期コルーチンの実装方法を詳しく紹介します。

  1. ユーザーの関心のある特徴の抽出

レコメンデーション システムでは、ユーザーの関心のある特徴の抽出は非常に重要なリンクです。ユーザーの行動ログはレコメンデーション システムにおける重要なデータの 1 つであるため、ユーザーの関心のある特徴を抽出するには、非同期 I/O を使用して行動ログを読み取り、処理する必要があります。

import asyncio
import json

async def extract_feature(data):
    result = {}
    for item in data:
        uid = item.get('uid')
        if uid not in result:
            result[uid] = {'click': 0, 'expose': 0}
        if item.get('type') == 'click':
            result[uid]['click'] += 1
        elif item.get('type') == 'expose':
            result[uid]['expose'] += 1
    return result

async def read_file():
    async with aiofiles.open('data.log', 'r') as f:
        data = []
        async for line in f:
            data.append(json.loads(line))
            if len(data) >= 1000:
                result = await extract_feature(data)
                print(result)
                data = []

        if len(data) > 0:
            result = await extract_feature(data)
            print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(read_file())
ログイン後にコピー

上述程序中,extract_feature() 函数用于从用户行为日志中提取用户兴趣特征,read_file() 函数读取用户行为日志,并调用 extract_feature() 函数进行用户特征提取。在程序中,使用 if len(data) >= 1000 判断每次读取到的数据是否满足处理的条件。

  1. 物品信息聚合

在推荐系统中,物品信息的聚合是支持物品的综合推荐的必要环节。物品属性信息是推荐系统中的重要数据之一,因此需要使用异步 I/O 来进行读取和处理。

import asyncio
import json

async def aggregate_info(data):
    result = {}
    for item in data:
        key = item.get('key')
        if key not in result:
            result[key] = []
        result[key].append(item.get('value'))
    return result

async def read_file():
    async with aiofiles.open('data.log', 'r') as f:
        data = []
        async for line in f:
            data.append(json.loads(line))
            if len(data) >= 1000:
                result = await aggregate_info(data)
                print(result)
                data = []

        if len(data) > 0:
            result = await aggregate_info(data)
            print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(read_file())
ログイン後にコピー

上述程序中,aggregate_info() 函数用于从物品属性信息中聚合物品信息,read_file() 函数读取物品属性信息,并调用 aggregate_info() 函数进行信息聚合。在程序中,使用 if len(data) >= 1000 判断每次读取到的数据是否满足处理的条件。

  1. 推荐结果排序

在推荐系统中,推荐结果的排序是支持高吞吐量和低延迟的关键环节。通过异步协程进行推荐结果的排序和过滤,可以大大提高推荐系统的性能表现。

import asyncio

async def sort_and_filter(data):
    data.sort(reverse=True)
    result = []
    for item in data:
        if item[1] > 0:
            result.append(item)
    return result[:10]

async def recommend():
    data = [(1, 2), (3, 4), (2, 5), (7, 0), (5, -1), (6, 3), (9, 8)]
    result = await sort_and_filter(data)
    print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(recommend())
ログイン後にコピー

上述程序中,sort_and_filter() 函数用于对推荐结果进行排序和过滤,并只返回前 10 个结果。recommend() 函数用于模拟推荐结果的生成,调用 sort_and_filter() 函数进行结果排序和过滤。在程序中,使用 0 或者 0 以下的值来模拟不需要的结果。

总结

本文介绍了异步协程的基本知识和在推荐系统中的应用,并提供了具体的代码示例。异步协程作为一种高效的并发编程技术,在大数据场景下具有广泛的应用前景。需要注意的是,在实际应用中,需要根据具体的业务需求和技术场景进行针对性的选择和调优,以达到最优的性能表现。

以上が非同期コルーチン開発ガイド: 高性能レコメンデーション システムの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート