协程与线程套接字通讯
基于多线程实现套接字服务端支持并发,服务端
 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. 用python做一个烟花show

    烟花效果如图(截了几个时刻的静态图): 源代码如下: # -*- coding: utf-8 -*- # Nola import tkinter as tk from PIL import Image ...

  2. MegaCli 简易使用介绍

    查看帮助 MegaCli64 -h 适配卡配置 查看RAID控制器的数量 MegaCli64 -adpCount 查看所有raid卡详细信息 MegaCli64 -AdpAllInfo -aALL 查 ...

  3. 调用 LoadLibraryEx 失败,在 ISAPI 筛选器 "C:\Program Files\php\php5isapi.dll"

    把 ISAPI 筛选器这里的php配置删掉,php改用fastcgi配置

  4. ln 链接命令 简要说明 软硬链接关系说明

    ln [选项] 目标 -s 创建符号链接(软链接) -f 强制创建链接 -i 覆盖前先询问 -v 显示创建链接过程 ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接经常被用到 删除软链接 ...

  5. 二、JAVA基本数据类型:内置数据类型,引用类型

    变量的值存储在内存中,内存管理系统通过变量的类型分配存储空间,且该空间只能存储该类型数据,通过定义不同的变量,在内存中储存不同类型的数据. JAVA的两大数据类型 1. 内置数据类型 2.引用数据类型 ...

  6. react native 开发报错

    1:oc对象名是RCTPoctalk 2:js中导入原生方法 3:报错:对象没有定义 出现这样的问题可能是react native 不允许使用“RCT”开头的前缀 4:解决办法:“RCT_EXPORT ...

  7. svn同步小脚本

    企业中难免会有使用svn 的怎么给svn做好备份呢 下面是用两个脚本进行同步和监控 同步脚本: #!/bin/bash i=1 while true do if [ $(expr $i % 12) = ...

  8. C语言求矩阵的逆

    #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <window ...

  9. Ajax请求传递数组参数

    var ids = []; var rows=$("#tt").datagrid("getSelections"); for(var i=0; i<row ...

  10. 《Linux内核原理与分析》第八周作业

    课本:第七章 可执行程序工作原理 ELF目标文件格式 目标文件:编译器生成的文件. 目标文件的格式:out格式.COFF格式.PE(windows)格式.ELF(Linux)格式. ELF(Execu ...