Python——gevent&asyncio模块(线程模块)

gevent模块

1. 第三方模块,需要自行安装。

2. 使用比较方便。

from gevent import monkey
import gevent
import time
monkey.patch_all()

def set():
    print('1.1')
    gevent.sleep(1)              #不写monkey时,只有这样写才会进行协程的切换工作。
    print('1.2')
def sleep():
    print('2.1')
    time.sleep(1)                #这样写,不会在IO时进行切换。只有写monkey时才会进行。
    print('2.2')

g1 = gevent.spawn(set)
g2 = gevent.spawn(sleep)
g1.join()
g2.join()
#gevent.joinall([g1,g2])  如果有多个,可以这么写。
print(g1.value)          #需要等待协程完成后才能获取,如果之前获取了,就是None
 

用协程简单实现一个socket

1. 当没有人连接时,会卡在accept中,

2. 有人连接后,会创建一个协程进行后面的处理。

3. 首先得等待主程序是否有阻塞,如果有那么进入协程中。

4. 协程中的recv如果也阻塞,那么再切回去。

5. 没有阻塞继续进行。

因为一直都会有accpet在,就会一直有io,所以不用join也可以。

############server##############

from gevent import monkey
import socket
import gevent
monkey.patch_all()

sk  = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen(20)
def up(conn):
    while True:
        msg = conn.recv(1024).decode('utf-8')
        print(msg.upper())
        conn.send(msg.upper().encode('utf-8'))
while True:
    conn,_ = sk.accept()
    gevent.spawn(up,conn)



###########clinet#############

import socket

sk  = socket.socket()


sk.connect(('127.0.0.1',9000))
sk.send(b'hahaha')
print(sk.recv(1024))

 

asyncio模块

1. 底层使用基于yeild的内置模块。

单任务+没有返回值。

import asyncio

async def func():
    print('1.1')
    await asyncio.sleep(0.5)             #固定格式,如果没有async在def前,那么就会报错。
    print('1.2')
async def slp():
    print('2.1')
    await  asyncio.sleep(1)
    print('2.2')
loop = asyncio.get_event_loop()          #获取时间循环对象
loop.run_until_complete(func())          #启动单个任务

 

多任务+没有返回值:

import asyncio

async def func():
    print('1.1')
    await asyncio.sleep(0.5)             #固定格式,如果没有async在def前,那么就会报错。
    print('1.2')
async def slp():
    print('2.1')
    await  asyncio.sleep(1)
    print('2.2')
loop = asyncio.get_event_loop()          #获取时间循环对象
wait_obj= asyncio.wait([func(),slp()])    #加入一个列表中
loop.run_until_complete(wait_obj)      #循环列表,运行。

  

多任务+有返回值+任务按照顺序回来

import asyncio

async def func():
    print('1.1')
    await asyncio.sleep(0.5)             
    print('1.2')
    return 111
async def slp():
    print('2.1')
    await  asyncio.sleep(1)
    print('2.2')
    return 222
loop = asyncio.get_event_loop()          
t1 = loop.create_task(func())
t2 = loop.create_task(slp())
task_li = [t1,t2]
wait_obj = asyncio.wait([t1,t2])
loop.run_until_complete(wait_obj)
for t in task_li:print(t.result())

  

多任务+先到先去结果

import asyncio

async def func(i):
    print(f'{i}=========1.1')
    await asyncio.sleep(0.5)            
    print(f'{i}=========1.2')
    return 111
async def slp(i):
    print('2.1')
    await  asyncio.sleep(1)
    print('2.2')
    return 222

async def main():
    task_li = []
    for i in range(10):
        task = asyncio.ensure_future(func(i))
        task_li.append(task)
    for ret in asyncio.as_completed(task_li):
        res = await ret
        print(res)

loop = asyncio.get_event_loop()          
loop.run_until_complete(main())

  

 

posted @ 2022-04-28 16:43  新兵蛋Z  阅读(231)  评论(0编辑  收藏  举报