Spielen Sie Python async

There are a few post about python asyncio introduced since Python 3.3. I played around and this is the note for myself.

Summary I evaluated thread and coroutine and find out the fact that the performace does not have a huge difference. Though, async is faster a little.(delimiter: I tested them with a really simple model. I do not say this is the ground truth.) Perhaps, the advantage of coroutine is chaining using yield from, which is easy to write compared with using queue and thread

Spec

Python async module was introduced in 3.3.

I'm not trying to reinvent the wheel. I'm trying to build a good one.

Guido van Rossum

import asyncio

Goals

Non goals

Coroutine, Futures and Tasks

Coroutines

Thread vs Coroutine

import time
import asyncio
import threading
import numpy as np


def fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)

@asyncio.coroutine
def co_fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)

def coroutine_test(n):
    tasks = [asyncio.ensure_future(co_fib(20)) for _ in range(n)]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(tasks))

def thread_test(n):
    threads = [threading.Thread(target=fib, args=(20,)) for _ in range(n)]
    for thread in threads:
        thread.start()

    for thread in threads:
        thread.join()

def evaluate(n, m):
    r = []
    print("thread start")
    for _ in range(n):
        s = time.time()
        thread_test(m)
        process_time = time.time() - s
        r.append(process_time)
    print("thread average: ", np.average(r), " secs")
    print("thread distribution: ", np.var(r))

    r = []
    print("coroutine start")
    for _ in range(n):
        s = time.time()
        coroutine_test(m)
        process_time = time.time() - s
        r.append(process_time)
    print("coroutine average: ", np.average(r), " secs")
    print("coroutine distribution: ", np.var(r))


if __name__ == "__main__":
    evaluate(100, 1000)


Result

thread start
thread average:  2.26430218458  secs
thread distribution:  0.000516381104439
coroutine start
coroutine average:  2.17451543093  secs
coroutine distribution:  0.00377455202351

reference

http://www.slideshare.net/saghul/asyncio

Recommended Posts

Spielen Sie Python async
Spielen Sie mit 2016-Python
Spielen Sie YouTube in Python
Python async / warte auf Kuriosität
Python Handspiel (Division)
Scraping mit Python 3.5 async / await
Python-Handspiel (zweidimensionale Liste)
Python
[Python] Spielen Sie mit Discords Webhook.
Python-Handspiel (Argparse-Mindestcode)
Python: So verwenden Sie Async mit
Verstecke Websockets asynchron / warte in Python3
Lass uns mit Python mit Python spielen [Anfänger]
[Python] Asynchrone Anfrage mit async / await
Kafka Python
Videowiedergabe mit Ton auf Python !! (tkinter / imageio)
Python-Zusammenfassung
Eingebaute Python
Python-Einschlussnotation
Python-Technik
Python-Handspiel (berechnet voller Mordred)
Python studieren
Python 2.7 Countdown
Python FlowFishMaster
Installieren Sie Pyaudio, um Wellen in Python zu spielen
Python-Dienst
Python-Tipps
Spielen Sie eine Audiodatei von Python mit Interrupt ab
Python-Funktion ①
Python-Grundlagen
Python-Memo
Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Ufo-> Python (3)
Spielen Sie kontinuierlich die MV der ersten Python Skusta
Python-Einschlussnotation
Python-Handspiel (Deskriptorberechnung: seriöse Version)
Installieren Sie Python
Python-Grundlagen ④
Python-Memorandum 2
Python-Memo
Python Jinja2
Python-Inkrement
atCoder 173 Python
[Python] -Funktion
Python-Installation
Suchen und spielen Sie YouTube-Videos mit Python
Python installieren 3.4.3.
Python-Memo
Python iterativ
Fraktal zum Erstellen und Spielen mit Python
Python-Algorithmus
Python2 + word2vec
[Python] -Variablen
Python-Funktionen
Python sys.intern ()
Python-Tutorial
Python-Fraktion
Python Underbar Das ist was
Python-Zusammenfassung