在固定线程池,批量调用异步函数,如何修改代码

在固定线程池,批量调用异步函数,如何修改代码

from concurrent.futures import ThreadPoolExecutor, as_completed
import time
import random
import queue
import asyncio
import threading


def print_error(value):
    error = value()
    print("error: ", error)


# 传入多个参数
async def work2(name,m):
    while True:
        cake = q1.get(timeout=3, block=False)
        # print("cake值:{}".format(cake))
        if cake and int(cake) % 14 != 0:
            print("线程名{}-*-{}".format(name, cake))
            await asyncio.sleep(3)
            # time.sleep(1)
        elif cake and int(cake) % 14 == 0:
            print("线程名{}--退出{}".format(name, cake))
            return
        if q1.empty():
            break


# 线程池有多少就限制运行多少个线程,其他阻塞,直至有线程腾空出来,顺序式
async def main1():
    start = time.perf_counter()
    new_loop = asyncio.get_event_loop()
    with ThreadPoolExecutor(3) as executor1:
        task_list = [
            new_loop.run_in_executor(executor1, work2, i, 3) for i in range(7)
        ]
        await asyncio.gather(*task_list)
        end = time.perf_counter()
        print(f'总计耗时:{end - start}')


if __name__ == '__main__':
    # 线程锁定义在全局,无需传入函数
    lock = threading.Lock()
    # 创建队列
    q1 = queue.Queue()
    for i in range(100):
        q1.put(i)


    asyncio.run(main1())  问题描述:RuntimeWarning: coroutine 'work2' was never awaited
  handle = None  # Needed to break cycles when an exception occurs.
RuntimeWarning: Enable tracemalloc to get the object allocation traceback 
要怎么修改才不会报错


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕燕燕 2022-09-03 18:39:55

同学,你好!async 实现异步可以参考以下思路:

async 定义异步函数

await 执行异步 

gather 将异步函数批量执行 

run 执行主异步函数

可以先完成课程中 10-4 小节的练习,理解一下异步

同学可详细描述一下该程序的思路、想要实现的功能,老师这边结合同学的需求看是否可以实现

祝:学习愉快!

  • 提问者 枫maple #1

    就好比总共有十个人(可用1-10),要对总量1000个珠子清洗(队列),每次只有容纳三个人的线程(thread-1-2-3)能同时工作(每次一人清洗一个),等1累瘫了,换4 使用线程1的thread位置上运行,此时工作线程(2-3-4),有可能十个都累瘫了,程序结束,或者清洗完所有(取完队列的数据),每次批量执行三个任务,轮替上

    2022-09-03 22:58:10
  • 好帮手慕凡 回复 提问者 枫maple #2

    同学,你好!

    在new_loop.run_in_executor( )前加await即可,如下图:

    https://img1.sycdn.imooc.com//climg/6314159f091e9c8211770306.jpg

    祝学习愉快~

    2022-09-04 11:04:47
  • 提问者 枫maple 回复 好帮手慕凡 #3

    这样子好像7个任务同时开始了,能不能限制单次只有3个任务执行,其他阻塞,等前面某一任务结束在自动加入开始

    2022-09-04 17:47:02
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师