协程与线程套接字通讯
基于多线程实现套接字服务端支持并发,服务端
 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. [BZOJ2427]软件安装

    Problem 每个软件都要安装某些软件才能安装,而且都有体积和价值,求安装的价值最大值 Solution 对于每个环,我们可以知道必须全部一起取或者不取,因此我们先用Tarjan缩点 然后我们用一个 ...

  2. 开机出错提示 cpu fan speed error detected

    问题:开机跳 cpu fan speed error detected 分析:提示是cpu fan speed 有问题进入 BIOS 设置了好几次仍不行 解决方法: 进入BIOS,BOOT选项卡,将 ...

  3. python私有属性和私有方法

    私有属性和私有方法 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私 ...

  4. springcloud学习计划

    后续参考学习spring cloud https://blog.csdn.net/forezp/article/details/70148833 https://github.com/forezp/S ...

  5. java面向对象编程(一)-类与对象

    1.问题的提出      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色.还有一只叫小花,今年100岁,花色.请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色.如果用户输入的小 ...

  6. 22.一个球从100m高度自由下落,每次落地后返跳回原高度的一半,再反弹。求它在第10次落地时,共经过多少米,第10次反弹多高。

    #include <stdio.h> #include <stdlib.h> int main() { ,hn=sn/; int i; ;i<=;i++) //注意i是从 ...

  7. python实现算术表达式的词法语法语义分析(编译原理应用)

    本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...

  8. Windows CMD 支持ls命令

    /********************************************************************** * Windows CMD 支持ls命令 * 说明: * ...

  9. pycharm中添加PATH变量

    最近在pycharm中run程序,终端terminal没有问题,在pycharm找不到$PATH中的变量值,如下图所示 同样的命令,在终端敲就没毛病,终端echo $PATH的时候,显示的是有cuda ...

  10. 【Java】字符串工具类

    import android.annotation.SuppressLint; import java.io.UnsupportedEncodingException; import java.uti ...