run_in_executor

 

原型 :

awaitable loop.run_in_executor(executorfunc*args

参数 : executor 可以是  ThreadPoolExecutor / ProcessPool  , 如果是None 则使用默认线程池

可使用 yield from 或 await 挂起函数

 

作用  : 例如在异步事件循环中 写文件, 这种那么慢的操作交给线程去做

完整例子: python 异步下载 完整例子

例子:

def block_func():
    with open("c:/PDFXVwer.zip",'rb') as fd:
        return fd.read(500)

async  def todo(lp:asyncio.AbstractEventLoop):
    readed = await lp.run_in_executor(None,block_func) # 默认线程池
    print("readed:",readed)


    with futures.ThreadPoolExecutor() as ex:
        readed = await lp.run_in_executor(ex,block_func)  # 自己创建一个线程池让事件循环调用
        print("readed :", readed)

lp = asyncio.get_event_loop()

lp.run_until_complete(todo(lp))

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码中,你使用`ThreadPoolExecutor`来并发执行多个`run_cases`任务。每个任务都是通过调用`pytest.main`来执行相应的测试用例。下面我会逐行解释这段代码的具体逻辑: 1. `marks_str = MyConf(os.path.join(basedir, "pytest.ini")).get("pytest", "markers")`:这行代码从配置文件中获取了所有的pytest标记字符串。 2. `marks = marks_str.split("\n")[1:]`:这行代码将标记字符串按换行符分割,并去除第一行(通常是"markers")。 3. `run_cases(mark_name)`:这是一个函数定义,用于执行指定标记的测试用例。它使用`pytest.main`来执行带有`-m`参数的pytest命令,并将结果输出到指定目录。 4. `with ThreadPoolExecutor(max_workers=3) as executor`:这是一个上下文管理器,创建了一个最大工作线程数为3的线程池。 5. `future_to_cases = []`:这是一个空列表,用于存储每个任务的`Future`对象。 6. `for mark in marks:`:遍历所有的标记。 7. `task = executor.submit(run_cases, mark)`:使用线程池提交一个`run_cases`任务,并将返回的`Future`对象添加到列表中。 8. `future_to_cases.append(task)`:将任务的`Future`对象添加到列表中。 9. `sleep(8)`:这是一个停顿的操作,每个任务提交后会等待8秒钟。这可能是为了在任务执行之间增加一些间隔时间。 请注意,上述代码中的`run_cases`函数根据标记执行测试用例,但在实际项目中,你可能需要根据自己的需求来修改和扩展`run_cases`函数,以执行相应的测试逻辑。 另外,确保你在使用`ThreadPoolExecutor`并发执行测试用例时,考虑到资源竞争和并发访问的问题,以避免潜在的并发冲突。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值