Max CPU s paralelní API volání do místní koncový bod pomocí Python

0

Otázka

Python 3.10

Byl jsem pověřen prokazující můžu max CPU svůj Mac notebook (10 jader), tím, že volá místní API endpoint, který běží na Java VM, stejně jako "měření a záznam propustnost," to vše pomocí Python. Pro paralelizaci, které jsem zkoumal, a rozhodl se jít s asyncio na tuto odpověď: https://stackoverflow.com/a/59385935/7191927

Mám v plánu použít htop ukázat všechny jádra na maximu tak, že část si myslím, že mám na které se vztahuje. Kde jsem nějakej průšvih je, co vlastně je třeba udělat v kódu max CPU.

To je to, co mám tak daleko. Tento kód je zavolat dva místní API koncových bodů (což každý jen proces bloky textu a extrahovat relevantní podmínky):

import asyncio
from api import API, DocumentParameters, EndException


def background(f):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, f, *args, **kwargs)
    return wrapped

@background
def get_word_results(data):
    api = API(url='http://localhost:8181/rest/words')     
    words_data = data        
    params = DocumentParameters()
    params["content"] = words_data 
    try:
        result = api.words(params)
    except EndException as exception:
        print(exception)
    return result

@background
def get_language_results(data):
    api = API(url='http://localhost:8181/rest/languages')     
    language_data = data        
    params = DocumentParameters()
    params["content"] = language_text_data 
    try:
        result = api.language(params)
    except EndException as exception:
        print(exception)
    return result

if __name__ == '__main__':
    filepath = "/Users/me/stuff.txt"
    with open(filepath, 'r') as file: 
        data = file.read()
    get_word_results(data)
    get_language_results(data)
    print('Done.')

To je místo, kde má Python znalosti/zkušenosti začíná ubývat.

Takže to, co by bylo nejvíce efektivní způsob, jak:

  1. Spustit tento kód neustále a na zvyšující se počty vláken ve snaze max CPU.
  2. Změřte a zaznamenejte propustnost, dle požadavku.

EDIT 1 - Bounty začal. Potřebuju solidní řešení pro tento - který maxes CPU a dává nějaký výstup, který ukazuje, že to, stejně jako, jak mnoho volání jsou vyrobeny a působit max. Na základě toho, co Pan Miyagi říká v komentářích, to zní, jako multiprocessing je to, co chci, a to buď místo, nebo v tandemu s asyncio Vítěz bude dosaženo s nejnižšími množství řádků kódu.

EDIT 2 - to musí být provedeno pomocí pomocí jednoho skriptu/programu, je spuštěn jednou, spíše než běží stejný scénář několikrát.

2

Nejlepší odpověď

1

Pomocí asyncio je to dobrá volba. Já bych pár, který s aiohttp aby volání na java service. Zde je uveden rámcový skript s awaitable test() metoda, která vám umožní spustit jako mnoho výzev, jak chcete, se jako mnoho z těchto hovorů současně, jak budete chtít:

import asyncio
import aiohttp

async def test():
  # examples: will run a total of 'task_count' calls limited to 'concurrency' running in parallel 
  task_count = 1000
  concurrency = 10

  async with aiohttp.ClientSession('http://localhost:8181') as session:
    semaphore = asyncio.Semaphore(concurrency)
    tasks = [asyncio.ensure_future(call_service(session, semaphore, task_id)) for task_id in range(0, task_count)]
    await asyncio.gather(*tasks)

async def call_service(session, semaphore, task_id):
  async with semaphore:

    # start your timer here

    async with session.get('/rest/words') as resp:
      await resp.text()
      # stop your timer here and log/accumulate stats

Hlavní je, že seznam asynchronní úkoly jsou vytvořeny, který může potenciálně spustit všechny ve stejnou dobu. Nicméně, budete chtít vědět, kolik to trvá max CPU tak concurrency parametru je za předpokladu, že umožňuje škrticí klapky, kolik hovorů se stalo ve stejnou dobu pomocí semaforů.

Já jsem komentoval kde si můžete přidat své výpisy pro spuštění měření časování.

2021-12-02 10:40:30

Díky moc za poskytování odpověděl Andy. Budu testovat později. Dle požadavku, měli byste být schopni přidat některé ukázkový kód pro "přihlásit/akumulovat statistiky" část? Vím, jak se instance časovače, ale třeba návod na nahrávání statistiky.
Stpete111

Ahoj, zase Andy - napadlo mě, jestli byste mohli být k dispozici, že se sejdeme v chatu, protože mám pár otázek o vašem řešení?
Stpete111
-1

Pro rychlý způsob, stačí spustit stejnou python soubor vícekrát. Max jen běžet 20 python skripty najednou, nebo tak něco.

2021-11-29 01:43:27

Přidal jsem EDIT 2 na můj příspěvek k vyjasnění, že tato nebude splňovat požadavek.
Stpete111

žádné starosti. Jen pokud jste přilepená. je to jen pár řádků bash na kick python skript načte časy. jen ten program na přijmout argumenty a předat v dávkách. trvá 2 minuty.
byteface

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................