zoukankan      html  css  js  c++  java
  • 协程 IO多路复用

    -----------------------------------------------------------------试试并非受罪,问问并不吃亏。善于发问的人,知识丰富。

    # # ------------------------------------------------------------------------------------------------------------#

    协程:gevent

    Gevent.spawn(func,123)

    Join () 等待异步提交的这些任务执行完毕

    joinall

    IO多路复用

    阻塞IO

    非阻塞IO模型

    Io多路复用

    Select  将所有需要监听的对象,放到一个列表里面,将这个列表交给select来监听,凡是有动静的对象,直接给你返回到一个列表中,然后我们循环这个列表,根据列表里面的有动静的对象,来进行对应的操作.  window 和 linux

    Poll  : 监听的对象数量没有上限,而select默认是1024个,Linux

    Select和poll内部在监听的所有对象的时候,是循环遍历的操作,挨个问一遍有没有数据

    Epoll : linux,每个被监听的对象,都是通过回调机制来搞的,也就是,监听的列表对象里面的这个对象,凡是有动静,自行通知epoll,然后epoll把这些有动静的对象返回.

    异步IO  最NB的,效率最高,因为将网络请求里面的两个io时间都省了

    from gevent import monkey;monkey.patch_all
    import time
    import gevent

    def func1(n):
    print('xxxx',n)
    #gevent.sleep(2)
    time.sleep(2)
    print("yyyy",n)

    def func2(m):
    print('oooo',m)
    # gevent.sleep(2)
    time.sleep(2)
    print("kkkk", m)


    g1 = gevent.gevent(func1,"马拉多纳")
    g2 = gevent.gevent(func2,"罗纳尔多")



    # # --------------[生成器版的任务切换]--------------

    import time

    def jishi1hao():
    for i in range(11):
    # print('到这里来!')
    yield #帮我们记录了任务的执行状态
    time.sleep(1)
    print('%s号客户2秒就搞定'%i)

    def jishi2hao():
    g = jishi1hao() #获得生成器
    next(g)
    for i in range(10):
    time.sleep(1)
    print('%s号技师,正在忙'%i)
    next(g)

    # jishi1hao()
    jishi2hao()



    # # --------------[02 greenlet简单使用]--------------

    import time
    import greenlet

    def func1():
    time.sleep(2)
    print('约吗?')
    g2.switch()
    time.sleep(2)
    print('不约')
    g2.switch()

    def func2():
    time.sleep(2)
    print('你好')
    g1.switch()
    time.sleep(2)
    print('你不好')

    g1 = greenlet.greenlet(func1)
    g2 = greenlet.greenlet(func2)

    g1.switch()

    # # --------------[03 gevent简单使用]--------------

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

    def func1(n):
    print('xxxxxx',n)
    # gevent.sleep(2)
    time.sleep(2)
    print('cccccc',n)

    def func2(m):
    print('111111',m)
    # gevent.sleep(2)
    time.sleep(2)
    print('222222',m)

    start_time = time.time()
    g1 = gevent.spawn(func1,'alex')
    g2 = gevent.spawn(func2,'德玛西亚')
    # g1.join() #
    # g2.join()
    gevent.joinall([g1,g2])
    end_time = time.time()
    print(end_time - start_time)

    print('代码结束')

    # # --------------[04 非阻塞IO模型客户端]--------------
    import socket
    client = socket.socket()

    client.connect(('127.0.0.1',8001))
    while 1:
    to_server_msg = input('我想对你说>>>>')
    client.send(to_server_msg.encode('utf-8'))
    from_server_msg = client.recv(1024)
    print(from_server_msg.decode('utf-8'))

    # # --------------[04 非阻塞IO模型服务端]--------------
    import time
    import socket

    server = socket.socket()

    ip_port = ('127.0.0.1',8001)
    server.bind(ip_port)

    server.listen()
    server.setblocking(False)
    conn_list = []

    while 1:
    while 1:
    try:
    conn,addr = server.accept()
    conn_list.append(conn)
    break
    except BlockingIOError:
    time.sleep(0.1)
    print('此时还没有人链接我')

    for sock in conn_list:
    print(sock)
    while 1:
    try:
    from_client_msg = sock.recv(1024)
    print(from_client_msg.decode('utf-8'))
    sock.send(b'hello')
    break
    except BlockingIOError:
    print('还没有任何的消息啊')







  • 相关阅读:
    凯立德2015夏季3621J0P4G卡版分区地图
    红山军马场坝上地图全集
    红山军马场坝上地图全集
    “坝上”到底在哪里?
    “坝上”到底在哪里?
    他山之石:OpenGL书籍推荐
    OpenGL3:开头篇 介绍
    Windows开发:WinSDK初始化
    C++03:论类的构造函数和析构函数
    MFC:绘图基础
  • 原文地址:https://www.cnblogs.com/dealdwong2018/p/10064653.html
Copyright © 2011-2022 走看看