Python asyncio之协程学习总结
实践环境Python3 6 2 什么是协程**协程**(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任
2023-05-28Python 3.6.2
(资料图片)
什么是协程协程(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任务,为非抢占式多任务生成子程序。协程也可以简单理解为协作的程序,通过协同多任务处理实现并发的函数的变种(一种可以支持中断的函数)。
下面,我们通过日常生活场景为例,对什么是协程进行说明。
假设A某在家每天都要做3件事:洗衣服(使用洗衣机),蒸饭(使用电饭煲),扫地(使用扫地机器人),这三样电器在完成任务后都会发出不一样响声来告诉A某事情已经完成。
这里,暂且假设A某智商有问题,每次都是严格按顺序做这三件事:先洗完衣服,再把饭蒸好,最后才开始扫地。
接下来,我们用一段简单的代码来模拟上述整个过程,并记录整个过程的耗时,其中使用了3个简单的普通函数,分别模拟上述3件事情,如下:
import timefrom datetime import datetimedef do_washing(): print(datetime.now(), ":开始洗衣服") time.sleep(3) # 洗衣服 # 用程序休眠来模拟过程,且别计较时间大小 print(datetime.now(), ":通知A某衣服洗好了") def steame_rice(): print(datetime.now(), ":开始蒸饭") time.sleep(5) # 蒸饭 print(datetime.now(), ":通知A某饭蒸好了")def do_clearing(): print(datetime.now(), ":开始扫地") time.sleep(2) # 扫地 print(datetime.now(), ":通知A某地扫完了")if __name__ == "__main__": startTime = time.time() do_washing() steame_rice() do_clearing() endTime = time.time() print("扫地+蒸饭+洗衣服总耗时: ", endTime - startTime)
程序输出:
2023-04-09 23:33:50.001204 :开始洗衣服2023-04-09 23:33:53.002765 :衣服洗好了2023-04-09 23:33:53.002765 :开始蒸饭2023-04-09 23:33:58.013337 :通知A某饭蒸好了2023-04-09 23:33:58.013337 :通知A某开始扫地2023-04-09 23:34:00.024784 :通知A某地扫完了扫地+蒸饭+洗衣服总耗时: 10.023579835891724
直到有一天,A某的朋友来他家做客,体验到他的“高效”办事效率后,建议他不用等每件事情都做完才做下一件事情。A某听后,虚心采纳,并告诉自己要开始培养新的习惯。
第二天开始呢,A某开始改变自己,把衣服扔洗衣机,并启动机洗程序后,就去淘米蒸饭了,等电饭煲开始蒸饭后,就去清扫地板了。
接下来,我们对上述代码进行稍微修改,以便模拟上述过程,并记录整个过程的耗时,如下:
import timefrom datetime import datetimeimport asyncioasync def do_washing(): print(datetime.now(),":开始洗衣服") await asyncio.sleep(3) print(datetime.now(),":通知A某衣服洗好了")async def do_clearing(): print(datetime.now(), ":开始扫地") await asyncio.sleep(5) print(datetime.now(), ":通知A某地扫完了")async def steame_rice(): print(datetime.now(), ":开始蒸饭") await asyncio.sleep(2) print(datetime.now(), ":通知A某饭蒸好了")tasks = [ do_washing(), steame_rice(), do_clearing()]if __name__ == "__main__": loop = asyncio.get_event_loop() start_time = time.time() loop.run_until_complete(asyncio.wait(tasks)) loop.close() end_time = time.time() print("扫地+蒸饭+洗衣服总耗时: ", end_time - start_time)
程序输出:
2023-04-09 23:35:17.422790 :开始扫地2023-04-09 23:35:17.422790 :开始蒸饭2023-04-09 23:35:17.422790 :开始洗衣服2023-04-09 23:35:19.427500 :通知A某饭蒸好了2023-04-09 23:35:20.427813 :通知A某衣服洗好了2023-04-09 23:35:22.429780 :通知A某地扫完了扫地+蒸饭+洗衣服总耗时: 5.0069899559021
不得不夸A某进步真大,相比之前,这次耗时减少了近一半。
以上这段代码就是协程的简单实现,充分体现了协程的3个特点:
多任务并行:A某同时完成了3项任务--分别代表3个协程。异步任务:3项任务中,没有一项是需要A某在一旁一直看着直到做完的,每项任务开启后,A某都可以离开去做别的任务。协作式(非抢占式):每项任务能否“占用”A某,取决于A某是否正被其它任务“占用”,即是否有任务主动“让出”A某,不是靠“抢占”,更像是协商。有了线程为啥还要协程?协程是用户视角的一种抽象,操作系统并没有这个概念,其主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度。
相对线程而言,协程具备以下优势:
减少内存占用
协程的创建成本远小于线程,可以设计得很小,小到KB级别,大大降低内存占用。所以,内存资源有限的情况下,可以创建更多协程,从而实现更高的并发。
减少上下文切换开销,节约CPU资源
如上图,线程之间的切换请求,由系统内核来实现,而协程之间的切换,则可由用户自由控制,即交由用户态的代码来完成,极大程度避免了系统内核级线程上下文切换造成的CPU资源浪费。具体实现思路如下:
尽量减少可执行的线程,这样切换次数必然会少
让线程尽可能的处于运行状态,而不是阻塞让出时间片
一个线程可以拥有多个协程,主要注意的是,一个线程内的多个协程却是串行的,无论CPU有多少个核,因为协程本质上还是一个函数,当一个协程运行时,其它协程必须挂起。实际开发过程中,可以使用协程在将一些耗时的IO操作异步化,例如写文件、耗时IO请求等来提升程序执行效率。
相关语法说明接下来,就上面的例子,对协程相关语法进行说明。
async def do_washing()
使用async def
语法定义协程函数do_washing
。
协程函数示例:
async def func(param1, param2): do_stuff() await some_coroutine()
注意:
使用async def
语法定义的函数始终是协程函数,即使它们不包含wait
或async
关键字。
采用传统的函数调用方式,直接调用协程函数,函数不会被立即执行,会产生类似RuntimeWarning: coroutine "xxxx协程函数" was never awaited
的告警日志,并返回一个协程对象。仅运行事件循环时才会运行协程。
await
挂起当前协程以等待一个可等待(awaitable)对象--协程函数或者实现了__await__()
的对象,直到可等待对象返回结果。可以将这个可等待对象,简单的理解为待执行的异步任务(一般是比较耗时的任务,比如开篇示例中用作比拟的煲饭)。
注意:
await
只能在协程函数内部使用。
程序遇到await
关键词时,会将程序控制权交给主程序,由主程序分配给其它协程。当可等待对象返回结果,并且此时程序控制权还被其它协程占用时,则被挂起的协程依旧无法继续往下运行,直到获取程序控制权。关于这个结论,可用下述示例代码进行验证:
from datetime import datetimeimport asyncioasync def do_washing(): print(datetime.now(),":开始洗衣服") await asyncio.sleep(0.5) for i in range(10000): if i % 4000 == 0: print("洗衣服") print(datetime.now(),":衣服洗好了")async def do_cooking(): print(datetime.now(), ":开始煲饭") for i in range(100000): if i%20000 == 0: print("煲饭") await asyncio.sleep(5) print(datetime.now(), ":饭煲好了")tasks = [ do_cooking(), do_washing()]if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) loop.close()
输出:
2023-04-10 23:53:37.804727 :开始洗衣服2023-04-10 23:53:37.804727 :开始煲饭煲饭煲饭煲饭煲饭煲饭洗衣服洗衣服洗衣服2023-04-10 23:53:38.310586 :衣服洗好了2023-04-10 23:53:42.811876 :饭煲好了
asyncio.sleep(2)
给定秒数后完成的协程--阻塞指定的秒数。sleep
函数还可以指定result
参数,协程完成时将该参数值返回给调用者(默认返回None
),如下:
result = await asyncio.sleep(0.5, result="task done")print(result) # 输出:task done
sleep
总是会挂起当前任务,以允许其他任务运行。可以利用这个特性,将秒数设置为0,即asyncio.sleep(0)
,以便提供一个经优化的路径以允许其他任务运行。 这可供长时间运行的函数使用,避免调用该函数时阻塞事件循环。
asyncio.get_event_loop()
为当前上下文获取事件循环(event loop),返回一个实现了AbstractEventLoop
接口的事件循环对象。如果没有为当前上下文设置任何事件循环,且当前策略没有指定创建一个事件循环,则抛出异常。必须返回非None
值。
AbstractEventLoop.run_until_complete(asyncio.wait(tasks))
运行直到asyncio.wait(tasks)
运行完成。返回asyncio.wait(tasks)
的运行结果,或者抛出异常。
asyncio.run(coro, *, debug=False)
执行协程 coro
并返回结果。
此函数会运行传入的协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭线程池。
当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。
如果debug
为 True
,事件循环将以调试模式运行。
此函数总是会创建一个新的事件循环并在结束时关闭之。它应当被用作 asyncio 程序的主入口点,理想情况下应当只被调用一次。
示例:
async def main(): await asyncio.sleep(1) print("hello")asyncio.run(main())
3.7 新版功能.
asyncio.wait(tasks)
具备完整参数列表的wait
函数定义如下
asyncio.wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED)
并发地运行 fs
可迭代对象中的可等待对象,并进入阻塞状态直到满足return_when
参数所指定的条件(缺省参值为ALL_COMPLETED
)。
注意,aws
参数不能为空。
函数返回 Future 集合: (done, pending)
。
请注意,此函数不会引发 asyncio.TimeoutError
。当超时发生时,未完成的 Future 将在指定秒数后被返回。
return_when
指定此函数应在何时返回,可选值如下:
FIRST_COMPLETED
函数将在任意可等待对象结束或取消时返回。
FIRST_EXCEPTION
函数将在任意可等待对象因引发异常而结束时返回。当没有引发任何异常时它就相当于ALL_COMPLETED
。
ALL_COMPLETED
函数将在所有可等待对象结束或取消时返回。
其它协程示例示例:Hello world携程import asyncioasync def hello_world(): print("Hello World!") return "hello world"# print(hello_world()) # RuntimeWarning: coroutine "hello_world" was never awaited # loop = asyncio.get_event_loop()# Blocking call which returns when the hello_world() coroutine is doneres = loop.run_until_complete(hello_world()) # 把协程对象传递给事件循环print(res) # 输出:hello worldloop.close()
python3.7版本,也可以使用新API asyncio.run
来简化代码
import asyncioasync def hello_world(): print("Hello World!") return "hello world" asyncio.run(hello_world())
示例:显示当前日期使用sleep()
函数在5秒内每1秒显示一次当前日期的协程示例
import asyncioimport datetimeasync def display_date(loop): end_time = loop.time() + 5.0 while True: print(datetime.datetime.now()) if (loop.time() + 1.0) >= end_time: break await asyncio.sleep(1)loop = asyncio.get_event_loop()# Blocking call which returns when the display_date() coroutine is doneloop.run_until_complete(display_date(loop))loop.close()
示例: 链式协程(Chain coroutines)import asyncioasync def compute(x, y): print("Compute %s + %s ..." % (x, y)) await asyncio.sleep(1.0) return x + yasync def print_sum(x, y): result = await compute(x, y) print("%s + %s = %s" % (x, y, result))loop = asyncio.get_event_loop()loop.run_until_complete(print_sum(1, 2))loop.close()
compute()
被链接到print_sum()
:print_sum()
协程等待compute()
完成后再返回结果
示例的序列图
“Task”是由AbstractEventLoop.run_until_complete()
方法在获取协程对象而不是任务时创建的。
该图显示了控制流程,但并没有确切描述事物内部是如何工作的。例如,sleep
协程创建了一个内部future
,它使用AbstractEventLoop.call_later()
在1秒内唤醒任务。
整体而言,python协程的可等待对象包含协程函数或者实现了__await__()
的对象,常见的可等待对象包含以下几种:
使用async def
定义的协程函数
Task
对象,比如使用 asyncio.create_task()
或 asyncio.ensure_future()
创建的任务对象。
Future
对象,比如使用 asyncio.Future()
创建的对象。
Future,是对协程的封装,代表一个异步操作的最终结果--将来执行或没有执行的任务的结果,其值会在将来被计算出来。
class asyncio.Future(*, loop=None)
该类基本兼容concurrent.futures.Future
。
差别:
result()
和exception()
不接受超时参数,并且在future尚未完成时引发异常。总是通过事件循环的call_soon_threadsafe()
调用使用add_done_callback()
注册的回调。该类与concurrent.futures
包中的wait()
和as_completed()
函数不兼容。该类不是线程安全的。
类方法
cancel()
取消future并安排执行回调
如果future已经完成或者取消,则返回False
。否则,修改future的状态为已取消,并安排执行回调,并返回True
。
cancelled()
如果future已取消则返回True
。
done()
如果future已完成则返回True
。
已完成意味着可获取结果或者异常,或者future已被取消。
result()
返回future呈现的结果。
如果future已被取消,则引发CancelledError
。如果future的结果还不可获取,则会引发InvalidStateError
。如果future已完成并且存在异常,则该异常会被抛出。
exception()
返回给future设置的异常。
只有在future完成时,才会返回异常(如果未设置异常,则返回None
)。如果future已被取消,则引发CancelledError
。如果future尚未完成,则会引发InvalidStateError
。
add_done_callback(fn)
添加一个回调,以便在future完成时运行。
使用一个future对象作为参数调用回调。如果调用时,future已经完成,则使用call_soon()
调用回调。
使用functools.partial
将参数传递给回调。例如
fut.add_done_callback(functools.partial(print, "Future:", flush=True))
将调用print("Future:", fut, flush=True)
remove_done_callback(fn)
从“call when done”列表中删除回调的所有实例。
返回已删除的回调数。
set_result(result)
标记future为已完成并设置其结果。
如果调用此方法时future已完成,则会引发InvalidStateError
set_exception(exception)
标记future为已完成并设置一个异常。
如果调用此方法时future已完成,则会引发InvalidStateError
。
run_until_complete()
的使用import asyncioasync def slow_operation(future): await asyncio.sleep(1) future.set_result("Future is done!")loop = asyncio.get_event_loop()future = asyncio.Future()asyncio.ensure_future(slow_operation(future))loop.run_until_complete(future)print(future.result()) # Future is done!loop.close()
协程函数负责计算(耗时1秒),并将结果存储到future。run_until_complete()
方法等待future的完成。
注意:run_until_complete()
方法在内部使用add_done_callback()
方法,以便在future完成时得到通知。
Future
类封装了可调用对象的异步执行
run_forever()
的使用可以使用Future.add_done_callback()
方法以不同的方式编写前面的示例,以明确描述控制流:
import asyncioasync def slow_operation(future): await asyncio.sleep(1) future.set_result("Future is done!")def got_result(future): print(future.result()) loop.stop()loop = asyncio.get_event_loop()future = asyncio.Future()asyncio.ensure_future(slow_operation(future))future.add_done_callback(got_result)try: loop.run_forever()finally: loop.close()
在本例中,future用于将slow_operation()
链接到got_result()
:当slow_ooperation()
完成时,将调用got_resull()
获取结果
class asyncio.Task(coro, *, loop=None)
安排协程的执行:将其封装在future。Task
是Future的一个子类。
task负责在事件循环中执行协程。如果封装的协程由future生成,则task将阻塞执行封装的协程并等待future的完成。当future完成并返回结果或者异常,封装的协程的执行将重新开始,并检索future的结果或异常。
事件循环使用协作调度:一个事件循环一次只运行一个task。如果其他事件循环在不同的线程中运行,则其他task可以并行运行。当task等待future完成时,事件循环会执行一个新task。
取消一项task和取消一个future是不同的。调用cancel()
将向封装的协程抛出CancelledError
。仅当封装的协程没有捕获CancelledError
异常或抛出CancelledError
异常时,cancelled()
才会返回True
。
如果一个挂起的task被销毁,则其封装的协程不会被执行完。这可能是一个bug,并记录一条警告:
Task was destroyed but it is pending!task: wait_for=>
不要直接创建Task
实例:使用ensure_future()
函数或AbstractEventLoop.create_task()
方法。
这个类不是线程安全的。
类方法
all_tasks(loop=None)
返回给定事件循环的所有任务集。默认返回当前事件循环的所有任务。
current_task(loop=None)
返回给定事件循环中当前正在运行的任务。默认返回当前事件循环中的当前任务。
不在Task上下文中调用该函数时返回None
cancel()
请求取消任务
安排在事件循环的下一个循环中将CancelledError
抛出到封装的协程中。然后,协程有机会使用try/except/finally
清理甚至拒绝请求。
与Future.cancel()
不同,这并不能保证task会被取消:异常可能会被捕获并采取行动,从而延迟task的取消或完全阻止取消。该task也可能返回一个值或抛出一个不同的异常。
调用此方法后,cancelled()
将不会立即返回True
(除非任务已被取消)。当封装的协程以CancelledError
异常终止时,task将被标记为已取消(即使未调用cancel()
)。
get_stack(*, limit=None)
返回此任务的协程的堆栈帧列表。
如果协程没有完成,则返回它被挂起的堆栈。如果协同程序已成功完成或被取消,则返回一个空列表。如果协同程序被异常终止,则返回traceback帧列表。
堆栈帧总是按从旧到新的顺序排列。
可选limit
给出了要返回的最大帧数;默认情况下,将返回所有可获取的帧。它的含义因返回堆栈还是trackback而不同:返回堆栈的最新帧,但返回traceback的最旧帧(这与traceback模块的行为相符)。
由于我们无法控制的原因,对于挂起的协程,只返回一个堆栈帧。
print_stack(*, limit=None, file=None)
打印此任务的协程的堆栈或traceback。
为get_stack()
检索的帧生成类似于traceback模块的输出。limit
参数被传递给get_stack()
。file
参数为I/O流,输出将写入该流;默认情况下,输出写入sys.stderr
并行执行3个task (A, B, C)
import asyncioasync def factorial(name, number): f = 1 for i in range(2, number+1): print("Task %s: Compute factorial(%s)..." % (name, i)) await asyncio.sleep(1) f *= i print("Task %s: factorial(%s) = %s" % (name, number, f))loop = asyncio.get_event_loop()loop.run_until_complete(asyncio.gather( factorial("A", 2), factorial("B", 3), factorial("C", 4),))loop.close()
输出:
Task B: Compute factorial(2)...Task C: Compute factorial(2)...Task A: Compute factorial(2)...Task B: Compute factorial(3)...Task C: Compute factorial(3)...Task A: factorial(2) = 2Task B: factorial(3) = 6Task C: Compute factorial(4)...Task C: factorial(4) = 24
task在创建时会自动被安排执行。事件循环将在所有task完成后停止。
Task函数注意:
在下面的函数中,可选的循环参数允许显式设置底层task或协程使用的事件循环对象。如果没有提供,则使用默认的事件循环
asyncio.as_completed(fs, *, loop=None, timeout=None)
返回一个迭代器,该迭代器在等待时为Future实例。
如果在所有Future
完成之前发生超时,则引发asyncio.TimeoutError
。
示例:
for f in as_completed(fs): result = yield from f # The "yield from" may raise # Use result
注意:future f不一定是fs
的成员
asyncio.ensure_future(coro_or_future, *, loop=None)
安排协程对象的执行:在其封装在Future中。返回一个Task
对象。
如果参数是Future
,则直接返回。
版本3.4.4中新增
版本3.5.1变更: 函数接受任何可等待对象。
asyncio.async(coro_or_future, *, loop=None)
废弃的ensure_future()
的别名
版本 3.4.4开始废弃
asyncio.wrap_future(future, *, loop=None)
将concurrent.futures.Future
对象封装在Future
对象中。
asyncio.gather(*coros_or_futures, loop=None, return_exceptions=False)
返回来自给定协程对象或future的future聚合结果。
所有future必须共享相同的事件循环。如果所有task都成功完成,那么返回的future结果就是结果列表(按照原始序列的顺序,不一定是结果到达的顺序)。如果return_exceptions
为true,则task中的异常将被视为成功的结果,并收集在结果列表中;否则,第一个抛出的异常将立即传递给返回的future。
取消:如果外部Future被取消,则所有子项(尚未完成)也将被取消。如果任何子项被取消,这将被视为引发CancelledError
错误——在这种情况下,外部Future不会被取消。(这是为了防止取消一个子项而导致其他子项被取消。)
asyncio.iscoroutine(obj)
如果obj是一个协程对象,该对象可能基于生成器或async def
协程,则返回True
。
asyncio.iscoroutinefunction(func)
如果func
被判断为协程函数,则返回True
,协程函数可以是被修饰的生成器函数或async def
函数。
asyncio.run_coroutine_threadsafe(coro, loop)
向给定的事件循环提交一个协程对象。
返回concurrent.futures.Future
以访问结果。
该函数被从不同于运行事件循环线程的线程调用。用法:
# Create a coroutinecoro = asyncio.sleep(1, result=3)# Submit the coroutine to a given loopfuture = asyncio.run_coroutine_threadsafe(coro, loop)# Wait for the result with an optional timeout argumentassert future.result(timeout) == 3
如果在协程中引发异常,则会通知返回的future。它还可以用于取消事件循环中的task:
try: result = future.result(timeout)except asyncio.TimeoutError: print("The coroutine took too long, cancelling the task...") future.cancel()except Exception as exc: print("The coroutine raised an exception: {!r}".format(exc))else: print("The coroutine returned: {!r}".format(result))
注意:与模块中的其他函数不同,run_coroutine_threadsafe()
要求显式传递loop参数。
版本3.5.1中新增
coroutine asyncio.sleep(delay, result=None, *, loop=None)
创建一个给定秒数后完成的协程--阻塞指定的秒数。sleep
函数还可以指定result
参数,协程完成时将该参数值返回给调用者(默认返回None
)
asyncio.shield(arg, *, loop=None)
等待future,保护它不被取消。
语句:
res = yield from shield(something())
等价于:
res = yield from something()
除非包含它的协程被取消,否则在something()
中运行的任务不会被取消。从something()
的视角来看,并没法生取消。但是它的调用者仍然被取消,所以yield from
表达式仍然会引发CancelledError
。注意:如果通过其他方式取消了something()
,这仍然会取消shield()
。
如果你想完全忽略取消(cancellation,不推荐),你可以将shield()
与try/except
子句结合使用,如下所示:
try: res = yield from shield(something())except CancelledError: res = None
coroutine asyncio.wait(futures, *, loop=None, timeout=None, return_when=ALL_COMPLETED)
等待futures
序列参数给定的Future和协程对象执行完成。协程将被封装在task中。返回两个Future集:(done,pending)
。
futures
序列参数不能为空。
timeout
参数可用于控制返回前等待的最大秒数。timeout
可以是int
或float
类型。如果未指定timeout
参数或参数值为空,则没有等待时间限制,即永不超时。
return_when
指示此函数何时返回。它必须是concurrent.futures
模块的以下常量之一:
FIRST_COMPLETED
当任何future完成或被取消时,函数将返回。FIRST_EXCEPTION
当任何future因为引发异常而结束时,函数将返回。如果没有future引发异常,那么它相当于ALL_COMPLETED
。ALL_COMPLETED
当所有future结束或被取消时,函数将返回。这个函数是一个协程。
用法:
done, pending = yield from asyncio.wait(fs)
注意这不会引发asyncio.TimeoutError
。pending
集合中存放的是发生超时时未完成的future。
coroutine asyncio.wait_for(fut, timeout, *, loop=None)
等待单个future或协程对象完成直到发生超时(如果超时限制的话)。如果timeout
为None
,则一直等待直到future完成。
协程将被封装在Task
中。
函数返回Future或协同程序的结果。当发生超时时,将取消task并抛出asyncio.TimeoutError
。为了避免任务取消,请将其封装在shield()
中。
如果取消wait
,那么future fut
也将被取消。
该函数为一个协程,用法:
result = yield from asyncio.wait_for(fut, 60.0)
参考连接:
https://www.shuzhiduo.com/A/gGdXlLmmd4/
标签:
实践环境Python3 6 2 什么是协程**协程**(Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任
2023-05-28《天宫课堂》线上课程系列,第二节课为大家介绍“高”端运动—微重力抗阻装置。随梦天舱上行的微重力抗...
2023-05-28大家好我是火锅饭。这次的内容本来是想做个视频的,但最近感冒了状态不太好,为了省事直接写个专栏吧。前段
2023-05-28人民网北京5月28日电(欧阳易佳)2023年全国林草科技活动周启动仪式今日在北京中国林业科学研究院举行。活
2023-05-281、【药品名称】通用名:复方利血平片英文名:CompoundReserpineTablets汉语拼音:Fufang
2023-05-28想必现在有很多小伙伴对于韩国乒乓球运动员石贺净、唐纳序原名是什么?方面的知识都比较想要了解,那么今天
2023-05-281、羊尖镇,隶属于江苏省无锡市锡山区,地处锡山区东部,东邻常熟市尚湖镇,南接厚桥街道,西连厚桥街道和
2023-05-281、055-79000主要讲述了美军太平间非法将大量变质甲醛倒入汉江,导致汉江水质受到污染,水中生物发生变异的
2023-05-28想必现在有很多小伙伴对于ems快递单号怎么查询方面的知识都比较想要了解,那么今天小好小编就为大家收集了
2023-05-28分家协议与遗嘱的区别在于:遗嘱是遗嘱人生前在法律允许的范围内,按照法律规定的方式对其遗产或其他事务所
2023-05-28工人日报-中工网记者窦菲涛2023年中关村论坛——“第二届碳达峰碳中和科技论坛”5月27日在京举办。中国...
2023-05-28最近,西亚足坛又爆出了一个“大瓜”,已经将C罗“撸”到手的沙特利雅得胜利俱乐部并不“消停”,最近又...
2023-05-28为哈登平冤,跟随约基奇冲冠!杜兰特颜面扫地,联盟真正赢家诞生,篮网队,凯文杜兰特,丹佛掘金队,詹姆斯...
2023-05-28很多消费者在购买电竞显示器的时候,往往会考虑高价的产品,一步到位。但实际需求一般并没有那么高,用不上
2023-05-28DoNews5月27日消息(丁凡)日前,在LG退出手机市场两年后,LG突然向用户发送邮件,宣布配套手机软件服务LGS
2023-05-281、随身WIFI的使用很简单的,我就以我现在用的腾讯全民WIFI来说吧。2、把它打开盖子,然后直接就可以接到电
2023-05-28INTOYOU女主角唇泥是一款备受欢迎的唇部护理产品,深受用户喜爱。本文将从产品功效、成分、使用方法和使用
2023-05-27加利福尼亚一家散乱的集装箱船房背后的建筑师透露了加拿大湖边住宅的计划,其中包括一串预制的模块化单元。
2023-05-27六一国际儿童节即将来临之际,恰逢杭州市儿童医院与上海交通大学医学院附属新华医院合作两周年。5月27日上
2023-05-271、已完结的11部作品《边若水》《相交的平行线》《多么神奇的娃》《魂兮归来之兄弟》《恩赐》《不按套路出
2023-05-27过端午竞龙舟初五畅想一下端午佳节在深圳中心城区观龙舟竞速、飞桨逐浪是什么感觉?6月22日“深爱·共进...
2023-05-271、郴州著名旅游景点:东江湖。2、电视台有打广告的,景色很美,而且附近有度假村,还可以坐轮船欣赏景色,
2023-05-27眼下,多地小麦陆续开镰收割。农业农村部最新农情调度显示,目前,全国冬小麦已收获7 9%。为了确保颗粒归仓
2023-05-27五月正是石斛花开的季节。在四川泸州市合江县金钗石斛现代农业园区内,白紫相间的金钗石斛花竞相绽放。
2023-05-271、不同的运营定位2、不同的外观3、不同的轨迹本文到此结束,希望对大家有所帮助。
2023-05-27@ChefPopa:夏尔巴人抛弃女性登山者,中国登山者放弃登顶出了一万美金让自己的夏尔巴向导给背下来了。所以
2023-05-27来为大家解答以下的问题,头打海兽祭祀怎么打,海兽祭祀怎么打这个很多人还不知道,现在让我们一起来看看吧
2023-05-27一直以来,钢铁侠留给我们的印象都是自私与狂妄,但是在今年上映的《复联4》中,却没想到他为了打败灭霸,
2023-05-27本报讯(记者顾小萍)我市2023年度第一批次公租房选房、入住工作近日陆续展开,300余户保障家庭拿到了期盼
2023-05-275月27日发布《博时利发纯债债券型证券投资基金分红公告》。本次分红为2023年度的第1次分红。公告显示,本次
2023-05-27证券时报网讯,当地时间5月26日,美股大幅收高。截至收盘,道指涨1%,报33093 34点;标普500指数涨1 3%,报
2023-05-27截至2023年5月26日收盘,信安世纪(688201)报收于42 9元,上涨4 69%,换手率2 74%,成交量1 73万手,成交额7259 54万元。
2023-05-27“朝朝宝”“零钱+”“灵活宝”……瞄准投资者的闲钱和零钱,多家银行纷纷推出各类零钱理财产品。这类产...
2023-05-27岭南功夫文化体验馆展示空间分为三大部分包括:“南武堂”、“龙狮会”以及配套的“功夫剧场”。
2023-05-27盛宝银行:美国国债收益率上升帮助支撑了美元:盛宝银行外汇策略主管JohnHardy在一份报告中说,在经济数据
2023-05-27洪涛股份(SZ002325,收盘价:1 63元)5月26日晚间发布公告称,公司于近日接到公司控股股东、实际控制人刘
2023-05-27Kotaku援引两名消息人士称育碧Massive开发的《星球大战》新作将于公司当前财年内发售。育碧当前财年是2024财年
2023-05-27中国与阿曼建交45周年招待会在马斯喀特举行---新华社马斯喀特5月25日电(记者汪强)中国驻阿曼大使馆24日晚
2023-05-27企查查APP显示,近日,中材科技风电叶片(定西)有限公司成立,法定代表人为徐俊,注册资本3亿元人民币,经
2023-05-272023年加拿大公开赛组委会公布了国羽报名名单,石宇奇、陈雨菲、凡晨组合和雅思组合等主力集体休战,由年轻
2023-05-26ST林重:独立董事关于公司第六届董事会第一次(临时)会议相关事项的独立意见
2023-05-265月26日,卢森堡证券交易所及金融代表团赴上海技术交易所参观访问。双方希望以此次见面交流为契机,在绿色
2023-05-26Relevo记者MatteoMoretto报道,阿方索-戴维斯是皇马左后卫引援首选。记者表示,皇马内部对左后卫球员谈论最
2023-05-26由韩国开发商WONDERPEOPLE制作的大逃杀游戏《超击突破2》(原《超级人类》)官方宣布,由于玩家数在持续减
2023-05-26韩亚航空一客机舱门在空中打开部分乘客呼吸困难
2023-05-26澳洲数据:4月零售销售持平,因为消费者减少食品和外出就餐消费;①澳洲4月零售销售持平,因面对高企的生活
2023-05-26詹姆斯在西决赛场遭到掘金横扫之后,赛后接受采访时就谈到了退役的话题,并且给了记者和球迷一个非常模棱两
2023-05-26大连万达商管就市场传闻发布澄清说明-5月26日,大连万达商业管理集团股份有限公司发布公告,澄清“珠海...
2023-05-262023年5月26日,德班世乒赛女单八强出炉,国乒大获全胜传来喜讯,五位队员全部晋级,陈幸同会师王曼昱,日
2023-05-26韩国《东亚日报》1月16日消息,经证实,韩国政府正考虑尹锡悦最快2月访日、同日本首相岸田文雄举行韩日首脑
2023-05-26成都市郫都区郫筒街道长青路幼儿园(三四八园区)2023年秋季招生补录通知招生补录对象小班:年满3周岁的郫
2023-05-26融资丨快控科技完成Pre-A轮融资,推进智能汽车中间件和以太网零件量产交付,专注于智能汽车新型EEA的中间件
2023-05-261、这个需要这样么?我交你个办法,到节假日的时候各大商场都要搞些促销活动,去拿张宣传单。2、在去改改,
2023-05-26三峡晚报讯(记者闫承敏通讯员黄月娥曹开玉)保护“一半山水一半城”城市风貌,建设“山水辉映、蓝绿交...
2023-05-26大河网讯近日,信阳市罗山县幸福工程队联合电商平台罗山在线成立助农团开展直播助农活动,通过发挥直播带货
2023-05-261、苔原猎手:菲兹,Q币价45,财付通价42 75元。2、菲兹这个皮肤拥有一身雪装,大招是一个黑色的虎鲸,并且
2023-05-26你们好,最近小品发现有诸多的小伙伴们对于水果拼盘简笔画图片带颜色,水果拼盘简笔画这个问题都颇为感兴趣
2023-05-26灌区建设是国家粮食安全的基础保障。近日,水利部公布了第一批深化农业水价综合改革推进现代化灌区建设试点
2023-05-261、讲述的是6对双胞胎与一个国中三年级男生[二见望]的故事`没错`从表面上看的确也很明显是后宫系的爱情动漫
2023-05-26给大家分享一篇关于手机知识的文章。相信很多朋友对手机还是不太了解。随后边肖还在网上搜集了一些关于手机
2023-05-26他表示,2023年厦门银行对公信贷有三大重点发展方向:一是巩固在中小客户群体中的优势;二是通过数字化转型
2023-05-26目前特朗普入狱结局已定美国内传来重要风声特朗普面临巨大危机的关注度特别高,热度非常高,这也证明大家现
2023-05-26五月天演唱会在即,网上“求票”的人多了起来。社交媒体上的留言从此前的“宁可鸟巢门口站,也不能让黄...
2023-05-26▲点击收听音频1我们走在岁月长河里,随着时间的流逝,一路成长,一路领悟。人生,逐渐变得厚重;脚步,也
2023-05-269是大成,Reno9系列回答了什么是Reno,Reno就是璀璨绚丽,光彩照人,有符合时代的设计,和超越时代的积极。
2023-05-26就在今天,城区压箱底地块挂牌了!2023WR003地块,最高楼面价约为2 6万 平,与鹏瑞·天玥仅一路之隔
2023-05-26导读1、李继存是谁演的?于宝珍--迟莲李忠厚--马少骅心甜--梦霞李特别是饰演于宝珍的演员迟蓬来喜饰演二孬
2023-05-26你可以让一件T恤看起来像僵尸服装。T恤是DIY僵尸服装的完美起始材料,因为无论如何你可能有一件旧衣服。撕
2023-05-26蔚来ES6上市当天李想立下flag:10月份理想L7月销破2万辆
2023-05-251、三餐正常,四餐满意。2、如果在意体重,那就对不起食物了。3、上天给了我很多变胖的机会,我都抓住了。4
2023-05-255月25日13时许,广西南宁市华海路与利华路十字路口路面突然塌陷出一个大坑,所幸没有造成人员伤亡
2023-05-25当前正值高校毕业生就业“百日冲刺”期,昨天(5月24日),教育部组织全国普通高校毕业生就业创业指导委...
2023-05-25大家好,小福来为大家解答以上的问题。674204554,6742这个很多人还不知道,现在让我们一起来看看吧!1、拨打
2023-05-25南方财经5月25日电,江苏索普公告,根据年度检修计划,公司醋酸、醋酸乙酯及其配套装置将于2023年5月26日起
2023-05-25胜通能源涨停收盘,收盘价28 73元。该股于13点16分涨停,未打开涨停,截止收盘封单资金为2758 41万元,占其
2023-05-251、血压的范围大概是120 80mmHg。随着年龄的增长,血压高90-130mmHg,脉压差20-40mmHg是正常的。
2023-05-25格隆汇5月25日丨涂鸦智能-W(02391 HK)发布公告,董事会谨定于2023年6月7日举行董事会会议,以考虑及通过(i)
2023-05-252023年5月24日普利制药融资净偿还180 86万元,融资余额2 94亿元
2023-05-25交易所则在年报问询函中一连向合纵科技抛出了多个问题,要求公司解释大额预付款项支付的必要性和合理性,是
2023-05-25贵阳和南宁:一线城市建设,三线城市经济?贵阳和南宁这两座城市一直互相攻击,互相比较,大家都知道,这两
2023-05-25同学们和村干部一起调研。红网时刻新闻5月24日讯(通讯员蓝慧芳)5月22日,湖南湘江新区白马街道迎来一批特
2023-05-25厦门网讯据福建日报报道(记者郑璜)记者从省商务厅获悉,23日,省商务厅(口岸办)联合福州海关、厦门海关
2023-05-25马来西亚羽毛球大师赛24日在吉隆坡结束首轮比赛,中国队女单、混双选手全部晋级下一轮。混双方面,冯彦哲
2023-05-25【解说】见到蔡志阳时,他正在果园里仔细地给手指柠檬树修剪枝芽。放眼望去,各式各样的奇花异果挂满枝头,
2023-05-25广州港南沙港区四期全自动化码头,集北斗导航、5G通讯、无人驾驶等前沿技术于一体。专家表示,去年以来,我
2023-05-25前些天,一场飞雪飘落九寨沟,将初夏九寨的青绿包裹在一片雪白之中。位于西南科技大学的创新平台——核...
2023-05-25我的文具盒一年级作文怎么写
2023-05-25晨会纪要
2023-05-25陆家嘴金融城里也能买到正宗金大团特色地产农产品啦!今天,2023年双金生辉暨金大团品牌展示活动在九六广场
2023-05-25来为大家解答以下的问题,线人成hs这个很多人还不知道,现在让我们一起来看看吧!1、all_sale_deduct_f=
2023-05-25聊聊一篇后的凶手,对于最后的凶手简单介绍的文章,网友们对这件事情都比较关注,那么现在就为大家来简
2023-05-251、梦幻西游在前不久的更新中加入了全新的神器任务“天罡印之谋”,这任务会有一些问题,这里我们整理了...
2023-05-251、手机目前只能一条一条的来删。2、电脑到可以:1 首先登陆新浪微博,然后再你的首页中点击应用选项,进入
2023-05-25爱国篮,爱CBA,我是洛姐,小伙伴们看完记得点赞!辽宁队的主帅杨鸣指导这个休赛期打算前往西班牙学习教练
2023-05-256月10日演出阵容按照艺人姓名首字母排序Doggie 打扰一下乐团 果味VC 黄子韬 HYPERSLASH超级斩 李宇春 梁老师Tsong 魔动
2023-05-25封面新闻独家专访了奥运冠军陈雨菲和世界排名第一的女双“凡晨”组合贾一凡、陈清晨,“复盘”了国羽在...
2023-05-25总台央视记者高晨源教育部今天发布通知,今年将继续实施农村订单定向医学生免费培养,要求各地做好2023年中
2023-05-25进球网:皇马将于明年夏天在姆巴佩和哈兰德之间做出选择直播吧5月24日讯《进球网》消息,皇马将于2024年夏
2023-05-25欢迎观看本篇文章,小升来为大家解答以上问题。蜕变意思,蜕变的意思很多人还不知道,现在让我们一起来看看
2023-05-241、崔宏毅,现任河北省保定市清苑区卫生健康局副科级干部。2、。本文到此分享完毕,希望对大家有所帮助。
2023-05-24Copyright © 2015-2022 西方水产网版权所有 备案号:沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com