协程与线程套接字通讯
基于多线程实现套接字服务端支持并发,服务端
 from socket import *
 from threading import Thread
 def comunicate(conn):
  while True:  # 通信循环
   try:
    data = conn.recv(1024)
    if len(data) == 0: break
    conn.send(data.upper())
   except ConnectionResetError:
    break
  conn.close()
 def server(ip, port, backlog=5):
  server = socket(AF_INET, SOCK_STREAM)
  server.bind((ip, port))
  server.listen(backlog)
  while True:  # 链接循环
   conn, client_addr = server.accept()
   print(client_addr)    # 通信
   t=Thread(target=comunicate,args=(conn,))
   t.start()
 if __name__ == '__main__':
  s=Thread(target=server,args=('127.0.0.1',8081))
  s.start()
单线程下实现并发的套接字通信,服务端
 from gevent import monkey;monkey.patch_all()    #******
 from socket import *
 from gevent import spawn
 def comunicate(conn):
  while True:  # 通信循环
   try:
    data = conn.recv(1024)
    if len(data) == 0: break
    conn.send(data.upper())
   except ConnectionResetError:break
  conn.close()
 def server(ip, port, backlog=5):
  server = socket(AF_INET, SOCK_STREAM)
  server.bind((ip, port))
  server.listen(backlog)
  while True:  # 链接循环
   conn, client_addr = server.accept()
   print(client_addr)
   spawn(comunicate,conn)  # 通信
 if __name__ == '__main__':
  g1=spawn(server,'127.0.0.1',8080)
  g1.join()
进程池线程池,同步/异步调用
 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
 import time,random,os
 def task(name,n):
  print('%s%s is running' %(name,os.getpid()))
  time.sleep(random.randint(1,3))
  return n**2
 if __name__ == '__main__':
  # print(os.cpu_count())
  p=ProcessPoolExecutor(4)
  #提交任务的两种方式:
  # 同步调用:提交完一个任务之后,就在原地等待,等待任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行的
  # 异步调用:提交完一个任务之后,不在原地等待,结果???,而是直接执行下一行代码,会导致任务是并发执行的
  l=[]
  for i in range(10): # 同步提交
   # res=p.submit(task,'进程pid: ',i).result()
   # print(res) # 异步提交
   future=p.submit(task,'进程pid: ',i)
   l.append(future)
  p.shutdown(wait=True) #关闭进程池的入口,并且在原地等待进程池内所有任务运行完毕
  for future in l:
   print(future.result())
  print('主')
 补充:1
   p=ProcessPoolExecutor(9)
  start=time.time()
  for url in urls:
   future=p.submit(get,url)
   # 异步调用:提交完一个任务之后,不在原地等待,而是直接执行下一行代码,会导致任务是并发执行的,,结果futrue对象会在任务运行完毕后自动传给回调函数
   future.add_done_callback(parse)  #parse会在任务运行完毕后自动触发,然后接收一个参数future对象
   p.shutdown(wait=True)
 补充:2
   p=ThreadPoolExecutor(4)
  for url in urls:
   future=p.submit(get,url)
   future.add_done_callback(parse)
  p.shutdown(wait=True)
 协程
  1. 目标:
   在线程下实现并发
    并发(多个任务看起来是同时执行就是并发):切换+保存状态
  2. 协程:
   协程是单线程实现并发
   注意:协程是程序员意淫出来的东西,操作系统里只有进程和线程的概念(操作系统调度的是线程)
   在单线程下实现多个任务间遇到IO就切换就可以降低单线程的IO时间,从而最大限度地提升单线程的效率
gevent模块实现单线程并发通讯,服务端
 from gevent import monkey;monkey.patch_all()
 from gevent import spawn,joinall #pip3 install gevent
 import time
 def play(name):
  print('%s play 1' %name)
  time.sleep(5)
  print('%s play 2' %name)
 def eat(name):
  print('%s eat 1' %name)
  time.sleep(3)
  print('%s eat 2' %name)
 start=time.time()
 g1=spawn(play,'刘清正')
 g2=spawn(eat,'刘清正')
 # g1.join()
 # g2.join()
 joinall([g1,g2])
 print('主',time.time()-start)

day37协程与线程套接字通讯的更多相关文章

  1. unity3D中协程和线程混合

    这是我google unity3D一个问题偶然发现的在stackflow上非常有趣的帖子: 大意是 要在unity3D上从server下载一个zip,并解压到持久化地址.并将其载入到内存中.以下展示了 ...

  2. paip.提升性能---协程“微线程”的使用.

    paip.提升性能---协程的使用. 近乎无限并发的"微线程" 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...

  3. Unity 协程与线程

    协程是不同步的 协程 不是 线程,协同程序是 不同步 的 一个线程在程序中和其他线程是异步运行的,在多处理器机器中一个线程可以同时与所有其他线程的实时运行其代码,这使得线程编程能够解决很复杂的事情,因 ...

  4. I/O多路复用、协程、线程、进程

    select注册fd,阻塞,当有fd状态改变时返回,确认对应的fd,做下一步处理.简单来说就是先注册,注册完后休眠并设置一个定时器醒来查看,有事件就通知来取,进行后续动作,没事件就继续睡,再设闹钟.用 ...

  5. lua协程----ngx-lua线程学习笔记

    --[[ - @desc lua数据输出 - @param string 字符串 - return string --]] function dump(v) if not __dump then fu ...

  6. (day31) Event+协程+进程/线程池

    目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协 ...

  7. Lua 协程和线程区别

    协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua ...

  8. 多任务-python实现-进程,协程,线程总结(2.1.16)

    @ 目录 1.类比 2.总结 关于作者 1.类比 一个生产玩具的工厂: 一个生产线成为一个进程,一个生产线有多个工人,所以工人为线程 单进程-多线程:一条生产线,多个工人 多进程-多线程:多条生产线, ...

  9. 字节一面:go的协程相比线程,轻量在哪?

    1. 用户态和内核态 Linux整个体系分为用户态和内核态(或者叫用户空间和内核空间), 那内核态究竟是什么呢? 本质上我们所说的内核态, 它是一种特殊的软件程序,特殊在哪? 统筹计算机的硬件资源,例 ...

随机推荐

  1. Java容器解析系列(6) Queue Deque AbstractQueue 详解

    首先我们来看一下Queue接口: /** * @since 1.5 */ public interface Queue<E> extends Collection<E> { / ...

  2. Java的基本数据类型大小及其包装类

     Java的基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义 ...

  3. python自学第7天,函数,参数

    函数:逻辑结构化和过程化的一种编程方法 面向对象--->类 class 面向过程--->过程 def 函数编程--->函数def import time def logger(): ...

  4. 2456 Aggressive cows

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23866   Accepted: 11141 ...

  5. 多线程callable使用方法

    Runnable是执行工作的独立任务,但是它不返回任何值.在JavaSE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表的是从方法call()中返回的值,并且必须使用Executor ...

  6. [LeetCode&Python] Problem 844. Backspace String Compare

    Given two strings S and T, return if they are equal when both are typed into empty text editors. # m ...

  7. 记一次ssh配置的锅

    我们在使用git来管理代码的时候不可避免的要用到ssh密匙,这个密匙怎么配置的百度上很多. 我这边是使用sourcetree来配合管理代码的,但是我ssh配置好了以后无论是克隆代码还是推送代码都提示我 ...

  8. 关于js的对象创建方法(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)

    // 1.工厂方式创建对象:面向对象中的封装函数(内置对象) 简单来说就是封装后的代码,简单的工厂模式是很好理解的,关于它的作用,就是利用面向对象的方法,把一些对象封装,使一些占用空间多的,重复的代码 ...

  9. day05 None类型

    None:空类型 表示该值是一个空对象,既不是0也不是" ",判断时候都为False

  10. QMD ST表 倍增

    #include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(i ...