网络编程-----协程

概念:

 

  python的线程属于内核级别的,即由操作系统控制调度   (如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 
 单线程内开启协程,一旦遇到io,就会从应用程序级别  ( 而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)

  协程:  (简单来说就是单线程下的并发).

       指的是只在同一条线程上能够相互切换多个任务,

     遇到IO就切换实际上是我们利用协程提高工作效率的一种工作方式.

  特点:  

     (纤程,轻型线程)

     协程是操作系统级别的操作单位

     协程的切换开销更小,属于程序级的切换,对于操作系统来说是不可见的,不需要操作系统调                 度  

      单线程内就可以实现并发的效果,最大限度地利用cpu   修改共享数据不需要加锁

  他的效率如何?

     和操作系统本身没有关系,和线程也没有关系.

     而是看程序的调度是否合理

缺点:

协程的本质是单线程下,无法利用多核,所以他的顺序为(一个程序开启多个进程,每个进程开启多个线程,每个线程开启协程)

    协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程.

协程模块:

  greelet:在多个任务之间来回切换

  gevent ;也是多个任务之间切换(比上边的更强大)

用法:

import time

from greenlet import greenlet
‘‘‘
def play():#协程1
    print(‘娃哈哈‘)
    g2.switch()
    print(‘托儿索‘)
    g2.switch()
def sleep(): # 协程2
    print(‘喜之狼‘)
    g1.switch()
    print(‘儿童劫‘)
g1=greenlet(play)
g2=greenlet(sleep)
g1.switch()
‘‘‘
import gevent
def play():#协程1
    print(‘娃哈哈‘)
    gevent.sleep(0.3)
    print(‘托儿索‘)

def sleep(): # 协程2
    print(‘喜之狼‘)
    gevent.sleep(0.2)
    print(‘儿童劫‘)

g1=gevent.spawn(play)
g2=gevent.spawn(sleep)
# g1.join(0.5) # 阻塞0.5秒
# g2.join()#           #  精准的控制协程任务,一定是执行完毕之后join立即结束阻塞
print(‘哈哈‘)
gevent.joinall([g1,g2])

from gevent import monkey;monkey.patch_all()  # 把下面所有的模块中的阻塞都打成一个包,然后gevent就可以识别这些阻塞事件了
import time
import gevent
def play():   # 协程1
    print(time.time())
    print(‘start play‘)
    time.sleep(1)
    print(‘end play‘)
def sleep():  # 协程2
    print(‘start sleep‘)
    time.sleep(1)
    print(‘end sleep‘)
    print(time.time())

g1 = gevent.spawn(play)
g2 = gevent.spawn(sleep)
gevent.joinall([g1,g2])

协程下实现socekt通信:

服务端:from gevent import monkey;monkey.patch_all()
import socket
import gevent

def talk(conn):
    while True:
        msg = conn.recv(1024).decode()
        conn.send(msg.upper().encode())

sk = socket.socket()
sk.bind((‘127.0.0.1‘,9000))
sk.listen()

while True:
    conn,addr = sk.accept()
    gevent.spawn(talk,conn)

客户端:

import socket
import threading
def task():
    sk = socket.socket()
    sk.connect((‘127.0.0.1‘,9000))
    while True:
        sk.send(b‘hello‘)
        print(sk.recv(1024))

for i in range(500):
    threading.Thread(target=task).start()

原文地址:https://www.cnblogs.com/systemsystem/p/10116695.html

时间: 2024-10-30 03:26:22

网络编程-----协程的相关文章

17、第七周-网络编程 - 协程概念介绍、协程gevent模块并发爬网页

协程,又称微线程,纤程.什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置. 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销(注解:"原子操作(atomic operation)是不需要synchr

python网络编程--协程

1.协程 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.. 需要强调的是: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内

网络编程-协程-1、迭代器

知识点:什么叫迭代器?说起for遍历大家应该很熟悉,for i in xxx,in后面的对象是一个可迭代的对象,可迭代的对象不一定是迭代器,如列表,字典,字符串等这些都是可迭代对象,迭代器是调用了对象内部的__iter__方法和__next__方法,(不能说只要是迭代器就一定调用了__iter__和__next__,因为后面说到的生成器就不需要调用这俩个方法,而生成器是个特殊的迭代器) 1.代码示例,详情看注解: """需求:将一个类里面的列表通过迭代器方式打印出来"

网络编程-协程-3、使用协程创建多任务图片下载

知识点: 1.爬取网站图片 import re from urllib import request import time,os headeers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'} url = 'http://699pic.com/food.html?sem=1&sem_k

python 并发编程 协程 目录

python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 原文地址:https://www.cnblogs.com/mingerlcm/p/11148935.html

并发编程协程(Coroutine)之Gevent

Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程. 进程和协程 下面对比一下进程和协程的相同点和不同点: 相同点:我们都可以把他们看做是一种执行流,执行流可以挂起,并且后面可以在你挂起的地方恢复执行,这实际上都可以看做是con

python并发编程&协程

0x01 前导 如何基于单线程来实现并发? 即只用一个主线程(可利用的cpu只有一个)情况下实现并发: 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 1)其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多

并发编程——协程

协程: 基于单线程来实现并发. 协程并不是实际存在的实体,本质上是一个线程的多个部分. 比线程的单位更小--协程,纤程,在一个线程中可以开启很多协程. 在执行程序的过程中,遇到 IO 操作就冻结当前位置的状态,去执行其他任务,在执行其他任务的过程中,会不断地检测上一个冻结的任务是否 IO 结束,如果 IO 结束了,就继续从冻结的位置开始执行. 一个线程不会遇到阻塞--一直在使用CPU. 多个线程--只能有一个线程使用CPU. 协程比线程之间的切换和线程的创建销毁所花费的时间,空间开销要小的多.

python之并发编程—协程

引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把cpu的利用率提高很多了.但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程.创建线程.以及管理他们之间的切换. 随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发.这样就可以节省创建线进程所消耗的时间. 为此我们需要先回顾下并发的本质:切换+保存状