Event事件与协程

Posted jinhongquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Event事件与协程相关的知识,希望对你有一定的参考价值。



    1.Event事件
        Event事件的作用:
            - 用来控制线程的执行.
            - 由一些线程去控制另一些线程.

    2.进程池与线程池
        1)什么是进程池与线程池?
            进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量.

        2)进程池与线程池的作用:
            保证在硬件允许的范围内创建 (进程/线程) 的数量.

    3.协程
        - 进程: 资源单位
        - 线程: 执行单位
        - 协程: 在单线程下实现并发

        注意: 协程不是操作系统资源,他是程序起的名字,为让单线程能实现并发.

        协程的目的:
            - 操作系统:
                多道技术, 切换 + 保存状态
                    1) 遇到IO
                    2) CPU执行时间过长

            - 协程:
                通过手动模拟操作系统 "多道技术",实现 切换 + 保存状态
                    1)手动实现 遇到IO切换, 欺骗操作系统误以为没有IO操作.
                        - 单线程下遇到IO, 切换 + 保存状态
                        - 单线程下计算密集型, 来回切换 + 保存状态是,反而效率更低

                优点:
                    在IO密集型的情况下, 会提高效率.

                缺点:
                    若在计算密集型的情况下, 来回切换, 反而效率更低.

        4.TCP服务端实现协程
    
# 服务单
from gevent import monkey
monkey.patch_all()
import socket
from gevent import spawn
server = socket.socket()
server.bind((
    '127.0.0.1', 9550
))
server.listen(5)
print('启动服务端。。。')
def working(conn):
    while True:
        try:
            data = conn.recv(1024)
            if len(data) == 0:
                break
            print(data.decode('utf-8'))
            conn.send(data.upper())
        except Exception as e:
            print(e)
            break
    conn.close()
def server2():
    while True:
        conn, addr = server.accept()
        spawn(working, conn)
        # join()
if __name__ == '__main__':
    # 协程,单线程下实现并发
    g1 = spawn(server2)
    g1.join()


# 客户端
import socket
from threading import current_thread, Thread
def client():
    client = socket.socket()

    client.connect(
        ('127.0.0.1', 9550)
    )
    number = 0
    while True:
        data = f'{current_thread().name} {number}'
        client.send(data.encode('utf-8'))
        data = client.recv(1024)
        print(data.decode('utf-8'))
        number += 1

# 模拟500个用户并发去访问服务端
for i in range(500):
    t = Thread(target=client)
    t.start()

以上是关于Event事件与协程的主要内容,如果未能解决你的问题,请参考以下文章

自己手写调度器,理解Python中的asyncio异步事件循环与协程

自己手写调度器,理解Python中的asyncio异步事件循环与协程

自己手写调度器,理解Python中的asyncio异步事件循环与协程

异步回调,事件,线程池与协程

Kotlin 协程协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )

Kotlin 协程协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )