asyncio 有无ThreadPoolExecutor配合实例

task 是协程和 Future 的桥梁。

1.协程和线程池

结果中会认为配合线程池,不那么快。
但是,配合还是会带来一些好处,
比如:使用多线程,以至于整个主线程不阻塞

# coding=utf-8
import asyncio
import logging
from concurrent.futures import ThreadPoolExecutor
import time

logging.basicConfig(
    level=logging.INFO,
    format=" %(asctime)s [*] %(threadName)s %(message)s"
)


def call_back01 (x):
    time.sleep(3)
    logging.info(f"Get:{x}")


async def call_back02 (x):
    await asyncio.sleep(3)
    logging.info(f"Get:{x}")


if __name__ == "__main__":
    now = time.time()
    loop = asyncio.get_event_loop()
    
    # 1.协程和线程池-----------------------------------------------------
    ex = ThreadPoolExecutor(max_workers=10)
    tasks = list()
    for i in range(20):
        tasks.append(loop.run_in_executor(ex, call_back01, i))
    
    # 2.单单协程---------------------------------------------------------
    # tasks = [asyncio.ensure_future(call_back02(i)) for i in range(20)]
    loop.run_until_complete(asyncio.wait(tasks))
    print("总用时", time.time() - now)

输出:

 2019-10-09 21:23:52,313 [*] ThreadPoolExecutor-0_1 Get:1
 2019-10-09 21:23:52,314 [*] ThreadPoolExecutor-0_0 Get:0
 2019-10-09 21:23:52,314 [*] ThreadPoolExecutor-0_2 Get:2
 2019-10-09 21:23:52,314 [*] ThreadPoolExecutor-0_3 Get:3
 2019-10-09 21:23:52,314 [*] ThreadPoolExecutor-0_5 Get:5
 2019-10-09 21:23:52,314 [*] ThreadPoolExecutor-0_4 Get:4
 2019-10-09 21:23:52,315 [*] ThreadPoolExecutor-0_7 Get:7
 2019-10-09 21:23:52,315 [*] ThreadPoolExecutor-0_6 Get:6
 2019-10-09 21:23:52,315 [*] ThreadPoolExecutor-0_9 Get:9
 2019-10-09 21:23:52,315 [*] ThreadPoolExecutor-0_8 Get:8
 2019-10-09 21:23:55,315 [*] ThreadPoolExecutor-0_1 Get:10
 2019-10-09 21:23:55,316 [*] ThreadPoolExecutor-0_3 Get:12
 2019-10-09 21:23:55,317 [*] ThreadPoolExecutor-0_2 Get:13
 2019-10-09 21:23:55,318 [*] ThreadPoolExecutor-0_0 Get:11
 2019-10-09 21:23:55,318 [*] ThreadPoolExecutor-0_5 Get:14
 2019-10-09 21:23:55,319 [*] ThreadPoolExecutor-0_4 Get:15
 2019-10-09 21:23:55,319 [*] ThreadPoolExecutor-0_7 Get:16
 2019-10-09 21:23:55,324 [*] ThreadPoolExecutor-0_8 Get:19
 2019-10-09 21:23:55,324 [*] ThreadPoolExecutor-0_9 Get:18
 2019-10-09 21:23:55,324 [*] ThreadPoolExecutor-0_6 Get:17
总用时 6.01738715171814

2.单单协程

# coding=utf-8
import asyncio
import logging
from concurrent.futures import ThreadPoolExecutor
import time

logging.basicConfig(
    level=logging.INFO,
    format=" %(asctime)s [*] %(threadName)s %(message)s"
)


def call_back01 (x):
    time.sleep(3)
    logging.info(f"Get:{x}")


async def call_back02 (x):
    await asyncio.sleep(3)
    logging.info(f"Get:{x}")


if __name__ == "__main__":
    now = time.time()
    loop = asyncio.get_event_loop()
    
    # 1.协程和线程池-----------------------------------------------------
    # ex = ThreadPoolExecutor(max_workers=10)
    # tasks = list()
    # for i in range(20):
    #     tasks.append(loop.run_in_executor(ex, call_back01, i))
    
    # 2.单单协程---------------------------------------------------------
    tasks = [asyncio.ensure_future(call_back02(i)) for i in range(20)]
    loop.run_until_complete(asyncio.wait(tasks))
    print("总用时", time.time() - now)

输出:

 2019-10-09 21:23:24,115 [*] MainThread Get:0
 2019-10-09 21:23:24,116 [*] MainThread Get:2
 2019-10-09 21:23:24,116 [*] MainThread Get:6
 2019-10-09 21:23:24,116 [*] MainThread Get:14
 2019-10-09 21:23:24,117 [*] MainThread Get:19
 2019-10-09 21:23:24,117 [*] MainThread Get:18
 2019-10-09 21:23:24,117 [*] MainThread Get:17
 2019-10-09 21:23:24,118 [*] MainThread Get:16
 2019-10-09 21:23:24,118 [*] MainThread Get:13
 2019-10-09 21:23:24,118 [*] MainThread Get:15
 2019-10-09 21:23:24,118 [*] MainThread Get:12
 2019-10-09 21:23:24,119 [*] MainThread Get:11
 2019-10-09 21:23:24,119 [*] MainThread Get:10
 2019-10-09 21:23:24,119 [*] MainThread Get:9
 2019-10-09 21:23:24,119 [*] MainThread Get:8
 2019-10-09 21:23:24,119 [*] MainThread Get:5
 2019-10-09 21:23:24,120 [*] MainThread Get:7
 2019-10-09 21:23:24,120 [*] MainThread Get:4
 2019-10-09 21:23:24,120 [*] MainThread Get:1
 2019-10-09 21:23:24,120 [*] MainThread Get:3
总用时 3.0080056190490723
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 `ThreadPoolExecutor` 和 `DiscardPolicy` 的示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorDemo { public static void main(String[] args) { // 创建一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 0L, TimeUnit.MILLISECONDS, new MyQueue<>(2), new ThreadPoolExecutor.DiscardPolicy()); // 提交 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃 for (int i = 1; i <= 6; i++) { executor.submit(new MyTask(i)); } executor.shutdown(); } static class MyTask implements Runnable { private int taskId; MyTask(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task #" + taskId + " is running on " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Task #" + taskId + " is completed."); } } static class MyQueue<E> extends java.util.concurrent.LinkedBlockingQueue<E> { MyQueue(int capacity) { super(capacity); } @Override public boolean offer(E e) { // 如果队列已满,则直接丢弃新任务 return super.offer(e) || remove(size() - 1); } } } ``` 在上面的示例中,我们创建了一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池,并设置拒绝策略为 `DiscardPolicy`。 我们提交了 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃。这是因为任务队列容量为 2,当任务队列已满时,会创建新的线程执行任务,但是最大线程数为 4,此时已经有 2 个线程在运行,因此只能创建 2 个新的线程,而新的任务又有 2 个,因此后面的 2 个任务没有办法被执行,而是被丢弃了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值