Heim  >  Artikel  >  Backend-Entwicklung  >  Leitfaden zur asynchronen Coroutine-Entwicklung: Aufbau eines leistungsstarken Empfehlungssystems

Leitfaden zur asynchronen Coroutine-Entwicklung: Aufbau eines leistungsstarken Empfehlungssystems

WBOY
WBOYOriginal
2023-12-17 15:30:181320Durchsuche

Leitfaden zur asynchronen Coroutine-Entwicklung: Aufbau eines leistungsstarken Empfehlungssystems

Mit der rasanten Entwicklung des Internets und des mobilen Internets ist die Datenmenge explodiert. Die effiziente Verarbeitung von Daten ist zu einem wichtigen Thema für die Forschungs- und Entwicklungsteams großer Unternehmen geworden. Empfehlungssysteme gehören zu den zentralen Anwendungsgebieten und sind in vielen Unternehmen weit verbreitet. Asynchrone Coroutinen sind eine wichtige Technologie zur Erzielung einer leistungsstarken Datenverarbeitung in Szenarien mit hoher Parallelität. In diesem Artikel wird die Verwendung asynchroner Coroutinen zum Aufbau eines leistungsstarken Empfehlungssystems vorgestellt und spezifische Codebeispiele bereitgestellt.

1. Was ist asynchrone Coroutine?

Asynchrone Coroutine ist ein sehr effizientes Modell für die gleichzeitige Programmierung. Es wurde ursprünglich von der Python-Sprache vorgeschlagen und implementiert. Es wurde von vielen Sprachen übernommen und weiterentwickelt, beispielsweise von Goroutine in der Go-Sprache, SwiftNIO in Swift usw. Asynchrone Coroutinen unterstützen hochgradig gleichzeitige asynchrone E/A-Vorgänge durch Umschalten auf Coroutinenebene.

Im Vergleich zu Multithreading haben asynchrone Coroutinen die folgenden Vorteile:

  1. Effizienter: Asynchrone Coroutinen können ein sehr leichtes Thread-Modell mit sehr geringem Umschaltaufwand implementieren.
  2. Flexibler: Das Umschalten zwischen Coroutinen muss nicht in den Kernel eingegeben werden, sondern wird vom Programm gesteuert, sodass die Anzahl und Planungsmethoden von Coroutinen flexibler gesteuert werden können.
  3. Einfacher zu verwenden: Im Vergleich zum Multithread-Sperrmechanismus können asynchrone Coroutinen Multithreading-Probleme wie Sperren durch kollaborative Planung vermeiden, wodurch der Code einfacher und benutzerfreundlicher wird.

2. Asynchrone Coroutine-Anwendungsszenarien in Empfehlungssystemen

Empfehlungssysteme müssen während der Implementierung große Datenmengen verarbeiten, z. B. Benutzerverhaltensprotokolle, Artikelattributinformationen usw., während asynchrone Coroutinen eine leistungsstarke Datenverarbeitung erreichen können . Insbesondere sind die folgenden Anwendungsszenarien im Empfehlungssystem für die Verwendung asynchroner Coroutinen geeignet:

  1. Extraktion von Benutzerinteressenmerkmalen: Das asynchrone Lesen und Verarbeiten von Benutzerverhaltensprotokollen wird durch asynchrone Coroutinen implementiert, und Benutzerinteressenfunktionen werden zur Unterstützung der Personalisierung extrahiert Empfehlungen.
  2. Aggregation von Artikelinformationen: Das asynchrone Lesen und Verarbeiten von Artikelattributinformationen wird durch asynchrone Coroutinen realisiert, und verschiedene Informationen werden aggregiert, um eine umfassende Empfehlung von Artikeln zu unterstützen.
  3. Sortierung der Empfehlungsergebnisse: Eine schnelle Sortierung und Filterung der Empfehlungsergebnisse wird durch asynchrone Coroutinen implementiert, um einen hohen Durchsatz und eine geringe Latenz des Empfehlungssystems sicherzustellen.

3. Leitfaden zur Entwicklung asynchroner Coroutinen

Im Folgenden wird der Entwicklungsleitfaden für asynchrone Coroutinen aus drei Aspekten vorgestellt: Coroutine-Entwicklungsprozess, Planungsmechanismus und asynchrone E/A-Operationen.

  1. Coroutine-Entwicklungsprozess

In asynchronen Coroutinen müssen Sie eine Coroutine-Bibliothek verwenden, um die Erstellung, den Wechsel und die Planung von Coroutinen zu realisieren. Zu den beliebtesten Coroutine-Bibliotheken gehören derzeit Asyncio in Python, Goroutine in Go und SwiftNIO in Swift.

Nehmen Sie Asyncio in Python als Beispiel, um ein einfaches asynchrones Coroutine-Programm zu implementieren:

import asyncio

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

loop = asyncio.get_event_loop()
loop.run_until_complete(foo())

Im obigen Programm bedeutet asyncio.sleep(1), die aktuelle Coroutine 1 Sekunde lang schlafen zu lassen Simulieren Sie asynchrone E/A-Vorgänge. Die von async def deklarierte Funktion stellt eine asynchrone Funktion dar. Verwenden Sie loop.run_until_complete() im Programm, um die Coroutine auszuführen, und das Ausgabeergebnis ist Hello World!. asyncio.sleep(1) 表示让当前协程休眠 1 秒钟,以模拟异步 I/O 操作,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。这里的两个协程的时间长度分别为 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 with aiofiles.open() 来异步打开文件,使用 async for line in f 来异步读取文件中的每行数据。在程序中使用 loop.run_until_complete()

    Planungsmechanismus

    In asynchronen Coroutinen ist die Planung von Coroutinen ein sehr wichtiger Teil. Durch die kollaborative Planung asynchroner Coroutinen können Anzahl und Planungsreihenfolge von Coroutinen flexibler gesteuert werden, um eine optimale Leistung zu erzielen.

      Verwenden Sie in Asyncio die Methode asyncio.gather(), um mehrere Coroutinen auszuführen, zum Beispiel:
    1. 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())
    2. Im obigen Programm kann asyncio.gather() sein Gleichzeitig ausgeführt. Führen Sie mehrere Coroutinen aus. Die Ausgabeergebnisse sind foo und bar. Die Zeitlängen der beiden Coroutinen betragen hier 1 Sekunde bzw. 2 Sekunden, die Ausgabereihenfolge ist also foo und bar.

      Asynchrone E/A-Vorgänge

      🎜🎜Im Empfehlungssystem müssen asynchrone E/A-Vorgänge verwendet werden, um eine große Menge an Benutzerverhaltensprotokollen, Artikelattributinformationen und anderen Daten zu verarbeiten. Die Verwendung asynchroner E/A-Operationen in asynchronen Coroutinen kann die Effizienz beim Lesen und Verarbeiten von Daten erheblich verbessern. 🎜🎜Verwenden Sie in Asyncio die Methode asyncio.open(), um Dateien asynchron zu lesen, zum Beispiel: 🎜
      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())
      🎜Verwenden Sie im obigen Programm async mit aiofiles.open() Um die Datei asynchron zu öffnen, verwenden Sie async for line in f, um jede Datenzeile in der Datei asynchron zu lesen. Verwenden Sie loop.run_until_complete() im Programm, um die Coroutine auszuführen. 🎜🎜4. Spezifische Codebeispiele🎜🎜Das Folgende ist eine detaillierte Einführung in die Implementierungsmethode asynchroner Coroutinen im Empfehlungssystem. 🎜🎜🎜Extraktion von Benutzerinteressenmerkmalen🎜🎜🎜Im Empfehlungssystem ist die Extraktion von Benutzerinteressenmerkmalen ein sehr wichtiger Link. Benutzerverhaltensprotokolle gehören zu den wichtigen Daten in Empfehlungssystemen. Daher müssen asynchrone E/A-Vorgänge zum Lesen und Verarbeiten von Verhaltensprotokollen verwendet werden, um Benutzerinteressenfunktionen zu extrahieren. 🎜
      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 以下的值来模拟不需要的结果。

      总结

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

Das obige ist der detaillierte Inhalt vonLeitfaden zur asynchronen Coroutine-Entwicklung: Aufbau eines leistungsstarken Empfehlungssystems. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn