Python协程之socket单线程下使用协程实现高并发

原创 2018年04月17日 18:18:53

先来看看服务端代码:

import sys,socket,time,gevent
from gevent import socket,monkey
monkey.patch_all()
import threading

def server(port):
    s = socket.socket()
    s.bind(('0.0.0.0',port))
    s.listen(500)
    while True:
        cli,addr = s.accept()
        # 建立一个协程去处理这个链接  这里是起一个协程,然后向链接对象传给写好的处理对象
        # 这里的意思就是,每来一个链接就启动一个协程去处理
        # 这样就是启动了一个并发处理连接的方法
        gevent.spawn(handle_requset,cli)
        # 开启线程的方式启动并发效果
        # t = threading.Thread(target=handle_requset,args=(cli,))
        # t.start()

def handle_requset(conn):
    try:
        while True:
            data = conn.recv(1024)
            if not data:
                conn.shutdown(socket.SHUT_WR) #这里就是关闭客户端 使用break方法也是一样的
                # print('并没有收到内容')
            else:
                print('recv:', data.decode())
            conn.send('ok'.encode('utf-8'))
    except Exception as e:
        print(e)
    finally:
        conn.close()

if __name__ == '__main__':
    server(9999)

然后开客户端代码:

import socket

HOST = 'localhost'
PORT = 9999
def conn_one():
    s = socket.socket()
    s.connect((HOST,PORT))
    while True:
        msg = input('>>:').strip()
        s.send(msg.encode('utf-8'))
        # s.send(('hello ').encode('utf-8'))
        data = s.recv(1024)
        print('recved:',data.decode())
    s.close()

conn_one()

# 这是开启100个连接并发
import socket
import threading

# def sock_conn(num):
#     client = socket.socket()
#     client.connect((HOST,PORT))
#     while True:
#         client.send(('hello %d'%num).encode('utf-8'))
#         data = client.recv(1024)
#         print("[%s]recv from server:" % threading.get_ident(), data.decode())
#     client.close()
#
# for i in range(1,101):
#     t = threading.Thread(target=sock_conn,args=(i,))
#     t.start()

'''
综述:
通常,我们写服务器处理模型的程序时,有以下几种模型:
(1)每收到一个请求,创建一个新的进程,来处理该请求;
(2)每收到一个请求,创建一个新的线程,来处理该请求;
(3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求
上面的几种方式,各有千秋,
第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。
第(2)种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。
第(3)种方式,在写应用程序代码时,逻辑比前面两种都复杂。
综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式
方式二:就是事件驱动模型
目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:
1. 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;
'''

在自己的pycharm中开启多个连接试一试吧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haeasringnar/article/details/79978751

Python高并发的网络编程库:eventlet

eventlet是一个用来处理和网络相关的python库函数,而且可以通过协程来实现并发,在eventlet里,把“协程”叫做 greenthread(绿色线程)。所谓并发,就是开启了多个greent...
  • S1234567_89
  • S1234567_89
  • 2016-09-18 10:10:31
  • 1079

Python3之协程socket应用

服务端from gevent import monkey;monkey.patch_all() import gevent from socket import *s = socket(AF_INET...
  • qq_33733970
  • qq_33733970
  • 2017-08-31 18:25:32
  • 235

C++协程与网络编程

转载自http://my.oschina.net/u/90679/blog/99394 文字略有修改。 协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协...
  • nirendao
  • nirendao
  • 2015-08-09 10:04:35
  • 907

c++协程1 (boost::coroutine)

#include #include using namespace boost::coroutines; //coroutine函数 void cooperative(coroutine...
  • chenhaifeng2016
  • chenhaifeng2016
  • 2017-04-21 11:05:38
  • 2002

构建C协程之setjmp/long_jmp篇

原理简介 在标准C中的头文件中定义了一组函数 setjmp / long_jmp 用来实现“非本地跳转”的功能,利用 setjmp 可以保存当前执行线索状态,稍后通过 long_jmp 函数...
  • kobejayandy
  • kobejayandy
  • 2014-12-06 22:16:45
  • 6407

如何实现高效的并发编程

1.无锁并发编程    锁竞争会引起上下文切换,所以避免使用锁是一种办法:例如将数据进行hash,进行分段,不同线程处理不同的段上的数据。 2.CAS算法    java的Atomic包使用CAS...
  • zhangt85
  • zhangt85
  • 2016-06-05 09:25:52
  • 684

python Gevent – 高性能的Python并发框架

在python里,按照官方解释greenlet是轻量级的并行编程,而gevent呢,就是利用greenlet实现的基于协程的python的网络library,好了,关系理清了。。。 协程,gevent...
  • freeking101
  • freeking101
  • 2016-11-09 11:10:14
  • 9121

python中多进程+协程的使用以及为什么要用它

前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重、切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL,...
  • lambert310
  • lambert310
  • 2016-04-15 16:25:03
  • 12328

C++协程(1):协程原理及实现方式概述

1.干货写在前面 协程是一种用户态的轻量级线程。本篇主要研究协程的C/C++的实现。 首先我们可以看看有哪些语言已经具备协程语义: · 比较重量级的有C#、erlang、golang* · 轻量级有p...
  • wentianyao
  • wentianyao
  • 2016-05-18 17:48:55
  • 2417

NIO单线程编写高性能、高并发服务器

原文地址 : http://blog.163.com/sean_zwx/blog/static/16903275520121254102918/
  • yazhouren
  • yazhouren
  • 2014-07-03 20:29:09
  • 905
收藏助手
不良信息举报
您举报文章:Python协程之socket单线程下使用协程实现高并发
举报原因:
原因补充:

(最多只允许输入30个字)