测试python同步异步执行方式

1. 代码

import time 
import asyncio 
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

def job(num):
    print(f'job {num}: start...')
    time.sleep(num)
    print(f'job {num}: end ...')


def elasped(func, num, s):
    print('-'*3, s, '-'*3)
    t0 = time.time()
    func(num)
    print(f'Complished in {time.time()-t0:.2f}s')

def sync(num):
    for i in range(1, num):
        job(i)

def thread_async(num):
    workers = num 
    with ThreadPoolExecutor(workers) as executor: 
        executor.map(job, range(1, num))

def process_async(num):
    workers = num 
    with ProcessPoolExecutor(workers) as executor: 
        executor.map(job, range(1, num))

async def coroutine_async(num):
    async def job(num):
        print(f'job {num}: start...')
        await asyncio.sleep(num)
        print(f'job {num}: end ...')

    await asyncio.gather(*[job(i) for i in range(1, num)])

def elasped2(func, num, s):
    print('-'*3, s, '-'*3)
    t0 = time.time()
    asyncio.run(func(num))
    print(f'Complished in {time.time()-t0:.2f}s')
    


if __name__ == '__main__':
    elasped(sync, 4, '同步执行') 
    elasped(thread_async, 4, '异步执行(多线程)')
    elasped(process_async, 4, '异步执行(多进程)')
    elasped2(coroutine_async, 4, '异步执行(协程)')

2. 结果

--- 同步执行 ---
job 1: start...
job 1: end ...
job 2: start...
job 2: end ...
job 3: start...
job 3: end ...
Complished in 6.00s
--- 异步执行(多线程) ---
job 1: start...
job 2: start...
job 3: start...
job 1: end ...
job 2: end ...
job 3: end ...
Complished in 3.00s
--- 异步执行(多进程) ---
job 1: start...
job 2: start...
job 3: start...
job 1: end ...
job 2: end ...
job 3: end ...
Complished in 3.03s
--- 异步执行(协程) ---
job 1: start...
job 2: start...
job 3: start...
job 1: end ...
job 2: end ...
job 3: end ...
Complished in 3.00s
posted @ 2020-08-29 21:45  成民  阅读(733)  评论(0编辑  收藏  举报