首页 > 编程语言 >python并发编程

python并发编程

时间:2023-03-18 19:32:04浏览次数:37  
标签:await python 编程 worker 并发 sleep url print asyncio

1.协程

示例1:

import time
import asyncio

async def crawl_page(url):
print('crawling {}'.format(url))
sleep_time = int(url.split('_')[-1])
await asyncio.sleep(sleep_time)
print('OK {}'.format(url))
async def main(urls):
for url in urls:
#await 执行,程序会阻塞在这里,进入被调用的协成函数crawl_page,执行完毕后再继续。
#是同步调用,在当前调用结束之前,是不会触发下次调用
await crawl_page(url)
#事件循环作为主程序的入口
asyncio.run(main(['url_1', 'url_2', 'url_3', 'url_4']))

'''
结果:
crawling url_1
等待1s.......
OK url_1
crawling url_2
等待2s.....
OK url_2
crawling url_3
等待3s........
OK url_3
crawling url_4
等待4s........
OK url_4
'''

花费的时间1+2+3+4 为10s.

示例2:

async def crawl_page_1(url):
print('crawling {}'.format(url))
sleep_time = int(url.split('_')[-1])
await asyncio.sleep(sleep_time)
print('OK {}'.format(url))

async def main_1(urls):
#任务创建后会很快的被调用,任务就不会阻塞在这里。
tasks = [asyncio.create_task(crawl_page_1(url)) for url in urls ]
for task in tasks:
await task
#事件循环作为主程序的入口
asyncio.run(main_1(['url_1', 'url_2', 'url_3', 'url_4']))

'''
结果:
crawling url_1
crawling url_2
crawling url_3
crawling url_4
OK url_1
OK url_2
OK url_3
OK url_4
'''

花费的时间为将近4s.

协程的执行解释:

import asyncio

async def worker_1():
print('worker_1 start')
await asyncio.sleep(1)
print('worker_1 done')

async def worker_2():
print('worker_2 start')
await asyncio.sleep(2)
print('worker_2 done')

async def main():
task1 = asyncio.create_task(worker_1())
task2 = asyncio.create_task(worker_2())
print('before await')
await task1
print('awaited worker_1')
await task2
print('awaited worker_2')

asyncio.run(main())


'''
执行结果:
before await
worker_1 start
worker_2 start
worker_1 done
awaited worker_1
worker_2 done
awaited worker_2
'''

asyncio.run(main()),程序进入 main() 函数,事件循环开启;

task1 和 task2 任务被创建,并进入事件循环等待运行;运行到 print,输出 'before await';

await task1 执行,用户选择从当前的主任务中切出,事件调度器开始调度 worker_1;

worker_1 开始运行,运行 print 输出'worker_1 start',然后运行到 await asyncio.sleep(1), 从当前任务切出,事件调度器开始调度 worker_2;

worker_2 开始运行,运行 print 输出 'worker_2 start',然后运行 await asyncio.sleep(2) 从当前任务切出;

以上所有事件的运行时间,都应该在 1ms 到 10ms 之间,甚至可能更短,事件调度器从这个时候开始暂停调度;

一秒钟后,worker_1 的 sleep 完成,事件调度器将控制权重新传给 task1,输出 'worker_1 done',task_1 完成任务,从事件循环中退出;

await task1 完成,事件调度器将控制器传给主任务,输出 'awaited worker_1',·然后在 await task2 处继续等待;

两秒钟后,worker_2 的 sleep 完成,事件调度器将控制权重新传给 task2,输出 'worker_2 done',task_2 完成任务,从事件循环中退出;

主任务输出 'awaited worker_2',协程全任务结束,事件循环结束。

标签:await,python,编程,worker,并发,sleep,url,print,asyncio
From: https://blog.51cto.com/u_12191723/6129770

相关文章

  • 这13个Python GUI库,正在学习Python的你必须知道
    Python是一种高级编程语言,它用于通用编程,由GuidovanRossum在1991年首次发布。Python的设计着重于代码的可读性。Python有一个非常大的标准库,并且有一个动态类型系......
  • Python3使用WOL唤醒群晖NAS
    1.pip3installwakeonlanpip3installwakeonlanLookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simpleCollectingwakeonlanDownloadinghttps://pypi.t......
  • Python中TypeError: ‘str‘ object is not callable 问题的解决方法
    Python中TypeError:‘str’objectisnotcallable问题的解决方法‘str’objectisnotcallable一般出现在企图调用一个不可被调用的对象。细看了一下代码......
  • CentOS7.3 + python2.7离线安装paramiko库
    环境操作系统版本python版本CentOS7.3python2.7.5资源准备​​https://ceekay.lanzouw.com/b012qfntc​​,密码:fa68资源包版本gccpython-devel-2.7.5-89.el7.x86_64.rpmpy......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上写......
  • 再谈编程范式(3):理解面向过程/面向对象/函数式编程的精髓
    面向过程(PO)面向过程是随着VB一起来到我的世界,那个时候会的非常有限,感觉能把程序写出来自己就非常棒了,VB是做那种可视化界面,在工具栏拖个框框放到面板上,然后就在各个事件上......
  • Python上下文管理器with的用法
    通常我们使用with关键字,作为上下文管理器进入标志。上下文管理器是一个包装任意代码块的对象,当退出上下文管理器时,保证相关的资源能够得到正确处理。最常用的用法是打......
  • 13 个非常有用的 Python 代码片段
    1:将两个列表合并成一个字典假设我们在Python中有两个列表,我们希望将它们合并为字典形式,其中一个列表的项作为字典的键,另一个作为值。这是在用Python编写代码时经常遇......
  • 实验2 C语言输入输出和控制语句应用编程
    实验任务11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#defineN55#defineR15866#defineR27017intmain()8{9intn......
  • 100道python基础题——(6)
    编写一个程序,根据给定的公式计算并打印值:。以下是C和H的固定值:C是50。H是30。D是一个变量,它的值应该以逗号分隔的序列输入到程序中。例子假设程序的输入序列是逗号分隔的......