VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • python基础(35):协程(3)

import threading
  • import gevent
  • import time
  • def eat():
  • print(threading.current_thread().getName())
  • print('eat food 1')
  • time.sleep(2)
  • print('eat food 2')
  •  
  • def play():
  • print(threading.current_thread().getName())
  • print('play 1')
  • time.sleep(1)
  • print('play 2')
  •  
  • g1=gevent.spawn(eat)
  • g2=gevent.spawn(play)
  • gevent.joinall([g1,g2])
  • print('')
  • 回到顶部(go to top)

    5. Gevent的同步和异步

    
    	
    1. from gevent import spawn,joinall,monkey;monkey.patch_all()
    2.  
    3. import time
    4. def task(pid):
    5. """
    6. Some non-deterministic task
    7. """
    8. time.sleep(0.5)
    9. print('Task %s done' % pid)
    10.  
    11. def synchronous(): # 同步
    12. for i in range(10):
    13. task(i)
    14.  
    15. def asynchronous(): # 异步
    16. g_l=[spawn(task,i) for i in range(10)]
    17. joinall(g_l)
    18. print('DONE')
    19.  
    20. if __name__ == '__main__':
    21. print('Synchronous:')
    22. synchronous()
    23. print('Asynchronous:')
    24. asynchronous()
    25. # 上面程序的重要部分是将task函数封装到Greenlet内部线程的gevent.spawn。
    26. # 初始化的greenlet列表存放在数组threads中,此数组被传给gevent.joinall 函数,
    27. # 后者阻塞当前流程,并执行所有给定的greenlet任务。执行流程只会在 所有greenlet执行完后才会继续向下走。
    回到顶部(go to top)

    6. Gevent之应用举例

    通过gevent实现单线程下的socket并发

    注意 :from gevent import monkey;monkey.patch_all()一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞。

    server:

    
    	
    1. from gevent import monkey;monkey.patch_all()
    2. from socket import *
    3. import gevent
    4.  
    5. #如果不想用money.patch_all()打补丁,可以用gevent自带的socket
    6. # from gevent import socket
    7. # s=socket.socket()
    8.  
    9. def server(server_ip,port):
    10. s=socket(AF_INET,SOCK_STREAM)
    11. s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    12. s.bind((server_ip,port))
    13. s.listen(5)
    14. while True:
    15. conn,addr=s.accept()
    16. gevent.spawn(talk,conn,addr)
    17.  
    18. def talk(conn,addr):
    19. try:
    20. while True:
    21. res=conn.recv(1024)
    22. print('client %s:%s msg: %s' %(addr[0],addr[1],res))
    23. conn.send(res.upper())
    24. except Exception as e:
    25. print(e)
    26. finally:
    27. conn.close()
    28.  
    29. if __name__ == '__main__':
    30. server('127.0.0.1',8080)

    client:

    
    	
    1. from socket import *
    2.  
    3. client=socket(AF_INET,SOCK_STREAM)
    4. client.connect(('127.0.0.1',8080))
    5.  
    6.  
    7. while True:
    8. msg=input('>>: ').strip()
    9. if not msg
    
    相关教程