python协程之动态添加任务的方法

python协程只能运行在事件循环中,但是一旦事件循环运行,又会阻塞当前任务。所以只能在当前进程中再开一个线程,这个线程的主要任务是运行事件循环,就是event_loop,因为他是一个无限循环,会阻塞当前线程。

放一个自己写的demo,注释写的很详细。

另外还有一点需要注意,一个事件循环中不能运行另外一个事件循环。

运行结果:

import asyncio
from threading import Thread

async def production_task():
  i = 0
  while True:
    # 将consumption这个协程每秒注册一个到运行在线程中的循环,thread_loop每秒会获得一个一直打印i的无限循环任务
    asyncio.run_coroutine_threadsafe(consumption(i),
                     thread_loop) # 注意:run_coroutine_threadsafe 这个方法只能用在运行在线程中的循环事件使用
    await asyncio.sleep(1) # 必须加await
    i += 1

async def consumption(i):
  while True:
    print("我是第{}任务".format(i))
    await asyncio.sleep(1)

def start_loop(loop):
  # 运行事件循环, loop以参数的形式传递进来运行
  asyncio.set_event_loop(loop)
  loop.run_forever()

thread_loop = asyncio.new_event_loop() # 获取一个事件循环
run_loop_thread = Thread(target=start_loop, args=(thread_loop,)) # 将次事件循环运行在一个线程中,防止阻塞当前主线程
run_loop_thread.start() # 运行线程,同时协程事件循环也会运行

advocate_loop = asyncio.get_event_loop() # 将生产任务的协程注册到这个循环中
advocate_loop.run_until_complete(production_task()) # 运行次循环

以上这篇python协程之动态添加任务的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python中协程实现TCP连接的实例分析

    在网络通信中,每个连接都必须创建新线程(或进程) 来处理,否则,单线程在处理连接的过程中, 无法接受其他客户端的连接.所以我们尝试使用协程来实现服务器对多个客户端的响应. 与单一TCP通信的构架一样,只是使用协程来实现多个任务同时进行. #服务端 import socket from gevent import monkey import gevent monkey.patch_all() def handle_conn(seObj): while True: re_Data = seObj.r

  • python编程使用协程并发的优缺点

    协程 协程是一种用户态的轻量级线程,又称微线程. 协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 优点: 1.无需线程上下文切换的开销 2.无需原子操作锁定及同步的开销 3.方便切换控制流,简化编程模型 4.高并发+高扩展性+低成本:一个CPU支持上万的协程都不

  • 对Python协程之异步同步的区别详解

    一下代码通过协程.多线程.多进程的方式,运行代码展示异步与同步的区别. import gevent import threading import multiprocessing # 这里展示同步和异步的性能区别,可以看到异步直接同时执行并完成, # 而同步,需要等待第一个完成后再次执行下一个,是有顺序的执行,而异步不需要 import time def task(pid): gevent.sleep(0.5) print('Task %s done' % pid) def task2(pid)

  • 在python里协程使用同步锁Lock的实例

    尽管asyncio库是使用单线程来实现协程的,但是它还是并发的,乱序执行的.可以说是单线程的调度系统,并且由于执行时有延时或者I/O中断等因素,每个协程如果同步时,还是得使用一些同步对象来实现. 比如asyncio就定义了一个锁对象Lock,它一次只允许一个协程来访问共享的资源,如果多协程想访问就会阻塞起来,也就是说如果一个协程没有释放这个锁,别的协程是没有办法访问共享的资源. 例子: import asyncio import functools def unlock(lock): print

  • 简单了解python协程的相关知识

    什么是协程 协程是python种一种实现多任务的方式,他是一种比线程更加小的单元,占用更小的执行单元(资源),为啥说他是一个执行单元,因为他自带CPU上下文,这样在合适gr的时机,可以把一个协程切换到另一个协程,只要在这个过程中保存和恢复cpu上下文那么程序还是可以运行的 通俗的理解: 一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量,然后切换到另一个函数中运行,并且切换的次数以及社么时候再切换回来是可控的 协程和线程的差异 在实现多任务时,线程会自己欢子一些数据,操作系统切换时需

  • 深入浅析python中的多进程、多线程、协程

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构--进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控

  • python中的协程深入理解

    先介绍下什么是协程: 协程,又称微线程,纤程,英文名Coroutine.协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换).但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行. 是不是有点没看懂,没事,我们下面会解释.要理解协程是什么,首先需要理解yield,这里简单介绍下,yield可以理解为生成器,yield item这行代码会产出一个值,提供给next(...)的调用方; 此外,还会作出让步,暂停执行生

  • python协程之动态添加任务的方法

    python协程只能运行在事件循环中,但是一旦事件循环运行,又会阻塞当前任务.所以只能在当前进程中再开一个线程,这个线程的主要任务是运行事件循环,就是event_loop,因为他是一个无限循环,会阻塞当前线程. 放一个自己写的demo,注释写的很详细. 另外还有一点需要注意,一个事件循环中不能运行另外一个事件循环. 运行结果: import asyncio from threading import Thread async def production_task(): i = 0 while

  • Python实现动态添加属性和方法操作示例

    本文实例讲述了Python实现动态添加属性和方法操作.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #!python3 class Person(): def __init__(self, name, age): self.name = name self.age = age p1 = Person('ff', '28') print(p1.name, p1.age) # 给实例对象动态添加sex属性 p1.sex = 'female' print(p1.sex

  • AngularJS实现动态添加Option的方法

    本文实例讲述了AngularJS实现动态添加Option的方法.分享给大家供大家参考,具体如下: 项目中后台管理设置,前台下拉动态添加option <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge&q

  • python实现给字典添加条目的方法

    本文实例讲述了python实现给字典添加条目的方法,是针对字典操作中比较实用的技巧.分享给大家供大家参考. 具体实现方法如下: def addWord(theIndex,word,pagenumber): theIndex.setdefault(word, [ ]).append(pagenumber)#存在就在基础上加入列表,不存在就新建个字典key d = {"hello":[3]} #d = {} addWord(d,"hello",3) addWord(d,

  • JS实现为表格动态添加标题的方法

    本文实例讲述了JS实现为表格动态添加标题的方法.分享给大家供大家参考.具体如下: JS中的表格对象带有一个createCaption方法用于为表格创建标题caption <!DOCTYPE html> <html> <head> <script> function createCaption() { var x=document.getElementById('myTable').createCaption(); x.innerHTML="My t

  • asp.net为网页动态添加关键词的方法

    本文实例讲述了asp.net为网页动态添加关键词的方法.分享给大家供大家参考.具体如下: 这段代码可以修改网页的keyword meta HtmlMeta keywords = new HtmlMeta(); keywords.Name = "keywords"; keywords.Content = "关键词"; Page.Header.Controls.Add(keywords); 希望本文所述对大家的asp.net程序设计有所帮助.

  • JavaScript动态添加列的方法

    本文实例讲述了JavaScript动态添加列的方法.分享给大家供大家参考.具体实现方法如下: /*** * 动态添加table 列 * @param result */ function addRow(resultJson){ /* var temp = []; temp = $.grep(arr, function(val, key) { if(val.indexOf('c') != -1) return true; // 如果[invert]参数不给或为false, $.grep只收集回调函

  • 给Ajax返回的HTML标签动态添加样式的方法

    今天在做项目时,在页面中用ajax返回了另一个页面,突然发现返回页面中的表格把页面给顶了出去,经过一番研究,终于解决了. 先准备好要返回内容的容器 <div class="container"> </div> 预定义一个样式,以便返回的内容能直接套用 比如,我们希望返回的表格不会太过分,把页面给顶开了... <style> .container table{ width:100%; } </style> 最后直接在容器中用ajax返回内容

  • JS实现给对象动态添加属性的方法

    本文实例讲述了JS实现给对象动态添加属性的方法.分享给大家供大家参考,具体如下: 在工作用要用到给jd对象动态添加属性的要求,在网上找到了一种解决方式,实例如下: 1.demo var aa="maker"; var bb=123; var lists={}; eval("lists."+aa+"="+bb); eval('('+"lists."+aa+"="+bb+')'); console.log(li

  • jQuery实现表格行和列的动态添加与删除方法【测试可用】

    本文实例讲述了jQuery实现表格行和列的动态添加与删除方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/19

随机推荐