其实简单的不得了.  弄个线程,在线程里运行一个新的事件循环. 然后调用 run_coroutine_threadsafe 即可.

asyncio基础 : python 异步 asyncio

asyncio.get_event_loop() 默认是主线程的事件循环 

每个线程一个事件循环 , 默认情况select循环

下面给出实现:

mport asyncio
def thread_running_loop(lp:asyncio.AbstractEventLoop):
    print('loop running')
    asyncio.set_event_loop(lp)    #在此线程中设置一个新的事件循环,默认情况下事件循环是主线程的
    lp.run_forever()              #一直运行
#随意的一个协程
async def xxx(arg):
    print('ready to work arg:' , arg)
    await  asyncio.sleep(1)
    print('done ', arg)
#创建一个新的事件循环给子线程
newlp = asyncio.new_event_loop()
t = threading.Thread(target=thread_running_loop,args=(newlp,))
t.start()
#添加5个协程. 并指定事件循环 (第2个参数)
for i in range(5):
    asyncio.run_coroutine_threadsafe(xxx(i),newlp)
t.join()

关闭 另一个线程的事件循环:

#线程函数
def th(lp:asyncio.AbstractEventLoop):
    #设置当前线程的事件循环
    asyncio.set_event_loop(lp)
        print("\t begin run_forever")
        lp.run_forever()
    except Exception as e:
        print("\t thread is done : " ,e)
    finally:
        lp.close()
    print("\t thread is done")
async def stop_it():
    # 都将获取当前线程的事件循环
    a = asyncio._get_running_loop()#asyncio.get_event_loop()
    a.stop()
if __name__ == '__main__':
    lp = asyncio.new_event_loop()#创建一个新事件循环
    t1 = threading.Thread(target=th,args=(lp,))
    t1.start() #启动线程
    time.sleep(1)
    print("begin")
    asyncio.run_coroutine_threadsafe(stop_it(),lp) #运行一个协程去关闭
    print("end")
    t1.join()
其实简单的不得了. 弄个线程,在线程里运行一个新的事件循环. 然后调用 run_coroutine_threadsafe 即可.asyncio基础 :python 异步 asyncioasyncio.get_event_loop() 默认是主线程的事件循环 每个线程一个事件循环 , 默认情况select循环下面给出实现:mport asyncio#线程def t...
python中的 asyncio 使用详解与异步 协程 的处理流程分析 在python的异步实践中,每次看asynicio都会有新的收获,本篇总结一下最近看这个库的使用。 一些核心概念 异步函数的定义 普通函数的定义是使用 def 关键词,异步的函数, 协程 函数( Coroutine )本质上是一个函数,特...
AbstractEventLoop. run _forever() 轮询I/O选择器直到遇到一个“0”超时,调用所有已排程的回调函数以响应I/O事件(以及那些已经排程的),然后 退出 。如果stop()在 run _forever时,就会运行当下的一批回调函数然后 退出 。注意回调函数被回调函数排程不会运行,他们会在下一次 run _forever时被调用。 在3.5.1版本发生改变 Abstr
刚接触异步 asyncio ,发现python文档一个版本一个变化,恼火。 东拼西凑终于解决了 asyncio 的多线程操作,记录下来。对于一个门外汉。太难了。 首先python3.9版本终于封装了一个多线程函数 asyncio .to_ thre ad(func, /, *args, **kwargs) #函数直接开线程,传递参数。感觉这才像python 目前3.9以下看来, asyncio 多线程实现就是,两个函数: run _in_executor 和 run _ coroutine _ thre ads afe 对应两种需求。
loop启动之后,ctrl+c, run _until_complete的执行异常。通过 asyncio .Task可以取消future。 import asyncio import time now = lambda: time.time() async def do_some_work(x): print("Hello:", x) time.sleep(1) return "w...
好的,我明白了,我来回答你的问题。 asyncio 包提供了多个工具用于控制 协程 的生命周期,包括取消 协程 协程 可以通过两种方式被取消:调用 协程 对象的cancel()方法或者让 协程 抛出一个 asyncio .CancelledError异常。 以下是两个简单的示例,演示如何使用这两种方式来取消 协程 。 方法1:调用cancel()方法 ```python import asyncio async def my_ coroutine (): while True: print(' 协程 正在运行...') await asyncio .sleep(1) except asyncio .CancelledError: print(' 协程 被取消了!') async def main(): coro = asyncio .create_task(my_ coroutine ()) # 创建 协程 任务 await asyncio .sleep(5) # 等待 5 秒钟 coro.cancel() # 取消 协程 任务 asyncio . run (main()) 上面的代码创建了一个 协程 任务,然后等待 5 秒钟后取消该任务。在my_ coroutine ()函数中,我们使用了一个while循环来模拟执行一些工作。当 协程 对象收到取消信号时,它将抛出 asyncio .CancelledError异常。我们在该异常发生时捕获它并输出一条消息。 该代码的输出应该类似于: 协程 正在运行... 协程 正在运行... 协程 正在运行... 协程 正在运行... 协程 正在运行... 协程 被取消了! 方法2:让 协程 抛出一个CancelledError异常 ```python import asyncio async def my_ coroutine (): while True: print(' 协程 正在运行...') await asyncio .sleep(1) async def main(): coro = asyncio .create_task(my_ coroutine ()) # 创建 协程 任务 await asyncio .sleep(5) # 等待 5 秒钟 coro.cancel() # 取消 协程 任务 asyncio . run (main()) 这里的代码几乎与前一个示例相同,除了在my_ coroutine ()函数中不再捕获 asyncio .CancelledError异常而是让它抛出。这样一来,我们无需显式调用cancel()方法, 协程 任务将在收到取消信号时自动抛出该异常。 输出应该与前一个示例相同。 这就是两种取消 asyncio 协程 的方法。当然,你也可以使用其他工具来终止 协程 。但总的来说,以上两种方式是最常用且最有效的。希望这能帮到你!
work_item = work_queue.get(block=True) if work_item is not None: #执行该任务(run方法内部会将future对象的result和expection状态更新) work_item.run() # Delete references to object. See issue16284 # 假设不del?会出现内存泄漏? # 自己模拟了一下,不会内存泄漏,那么删除del work_item 作用是什么?? del work_item [/code] 关于aiohttp下载大文件的方式 小牛头#: 写又不写完整, 模板参数 右值引用 折叠引用 forward 转发 dczzzzz: 折叠引用一直没听过这个名词,但一直被有模板参数的右值引用所困扰,现在终于解决了