Jouer 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

Jouer Python async
Jouez avec 2016-Python
Jouez à YouTube en Python
python async / attend curio
Jeu de main Python (division)
Scraping à l'aide de Python 3.5 async / await
Jeu de main Python (liste à deux dimensions)
Python
[Python] Jouez avec le Webhook de Discord.
Jeu de main Python (code minimum argparse)
Python: comment utiliser async avec
Masquer les websockets async / attendent dans Python3
Jouons avec Excel avec Python [Débutant]
[Python] Requête asynchrone avec async / await
python kafka
Lecture vidéo avec son sur python !! (tkinter / imageio)
Résumé Python
Python intégré
Notation d'inclusion Python
Technique Python
Jeu de main Python (calculé plein de mordred)
Étudier Python
Compte à rebours Python 2.7
Python FlowFishMaster
Installez Pyaudio pour lire des vagues en python
Service Python
astuces python
Lire un fichier audio à partir de Python avec interruption
fonction python ①
Les bases de Python
Mémo Python
Jouez des nombres manuscrits avec python, partie 2 (identifier)
ufo-> python (3)
Jouez en continu le MV du premier Python Skusta
Notation d'inclusion Python
Jeu de main Python (calcul du descripteur: version sérieuse)
Installer python
Les bases de Python ④
Mémorandum Python 2
mémo python
Python Jinja2
Incrément Python
atCoder 173 Python
[Python] fonction
Installation de Python
Rechercher et lire des vidéos YouTube avec Python
Installer Python 3.4.3.
Mémo Python
Itératif Python
Fractal pour faire et jouer avec Python
Algorithme Python
Python2 + mot2vec
[Python] Variables
Fonctions Python
Python sys.intern ()
Tutoriel Python
Fraction Python
underbar python C'est ce que
Résumé Python