单线程

Python 网络编程socket_server单线程响应请求

爷,独闯天下 提交于 2019-12-01 01:01:44
说明:刚开始接触python网络编程,使用socket编写一个简单的单线程server。socket模块提供了一个工厂函数,也被称为socket,开发者可以调用函数以生成一个套接字对象S。要想执行网络层操作,可以调用S上的方法。在客户程序中,可以调用S.connect连接到一个服务器。在服务器程序中,可以调用S.bind和S.listen等待客户程序的连接。在客户程序请求连接时,服务器程序可以调用S.accept接受请求,该方法将返回连接到客户程序的另一个套接字对象S1.在有了一个连接的套接字对象之后,就可以调用该对象的send方法传输数据,调用该对象的recv方法接收数据了。关于socket模块提供的函数和socket对象提供的方法请读者参阅python相关的技术书籍(例如《python技术手册》)。 分三步: 1.创建模块对象 2.创建模块对象的属性 3.调用模块对象的方法完成模块所想要实现的功能 【源码如下】 #import socket module #创建模块对象 from socket import * #创建模块对象的属性 serverSocket = socket(AF_INET, SOCK_STREAM) #Prepare a sever socket #调用方法绑定server监听的主机IP在端口8000上的连接 serverSocket.bind((''

协程:gevent

╄→гoц情女王★ 提交于 2019-11-30 16:11:58
阅读目录 一 引子 二 协程介绍 三 Greenlet模块 四 Gevent模块 引子   之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。   为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长       ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态    一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。   为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态

协程基础

泄露秘密 提交于 2019-11-30 06:28:00
协程基础 一、引言 之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把CPU的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。 随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。 为此我们需要先回顾下 并发的本质 : 切换+保存状态 。 CPU正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长。 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态。 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。 为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级

python之协程

醉酒当歌 提交于 2019-11-29 16:38:08
一、协程理论 1.1 协程产生的背景 之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU执行的最小单位。 随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。 本节我们就基于单线程来实现并发,首先我们要回顾一下并发的本质: 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制) (1)该任务发生了阻塞 (2)该任务计算时间过长或有个更高级的程序替代它 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 注意点1 第二种情况本质上并不能提高效率,只是为了cpu能雨露均沾,实现看起来所有任务被“同时”执行,如果多个任务是纯计算的,单纯的切换反而会降低效率。 1.2 yield实现并发 我们通过yield验证,yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 yield实现并发的缺点: (1

单线程执行任务和无锁链表

爱⌒轻易说出口 提交于 2019-11-29 06:16:46
#include <stdio.h> #include <stdlib.h> #include <poll.h> #include <pthread.h> #define offsetof(type, member) (size_t)&(((type *)(0))->member) #define contain_of(ptr, type, member) (type *)((*(size_t *) &ptr) - offsetof(type, member) typedef void (*fn_t)(int, char **); struct list { struct list *next; }; struct list_cnt { struct list root; struct list **tail; }; typedef struct task_queue { int argc; char **argv; fn_t fn; struct list node; } task_queue_t; static void put(struct list_cnt *head, struct list *node) { node->next = NULL; struct list **ptr = __sync_lock_test_and_set(&head->tail, &node

redis缓存

不问归期 提交于 2019-11-29 03:29:22
  redis的优点第一个就是速度快它是由c语言实现的基于内存读写的效率特别高第二个优点就是单线程模型所谓的单线程就是一个每个请求都会有一个新的线程来处理请求第三个优点就是使用的是非阻塞 i/o(i/o流) 不会再网上浪费时间第四个优点就是支持多数据类型存储 来源: https://www.cnblogs.com/zhaohuihui/p/11443534.html

进程,线程池 ,同步异步

梦想的初衷 提交于 2019-11-28 22:31:15
进程池,线程池 以时间换空间,控制进程,线程开启的数量 进程池与cpu一一对应是并行 线程池是并发:一个容器,这个容器限制住你开启线程(进程)的数量,比如4个,第一次肯定只能变更发的处理4个任务,只要有任务完成,线程马上就会接下一个人任务 以时间换空间,控制进程,线程开启的数量 进程池与cpu一一对应是(并行)或并行加并发 线程池是并发:一个容器,这个容器限制住你开启线程(进程)的数量,比如4个,第一次肯定只能变更发的处理4个任务,只要有任务完成,线程马上就会接下一个人任务 以时间换空间 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor def fun(): print(1) t=ThreadPoolExecutor()#实例化一个进程池对象 t.submit(fun)#用submit开启一个进程池 基于线程池的服务端 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import socket import os import time import random def communicate(conn, addr): while 1: # # try: from_client_data = conn

并发编程:协程

瘦欲@ 提交于 2019-11-28 20:18:17
一 引子   基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此需要先看下并发的本质:切换+保存状态 ​ cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在自己的程序里面来控制任务的切换。     ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态   一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 import time def func1(): for i in range(11

百万年薪python之路 -- 并发编程之 协程

拜拜、爱过 提交于 2019-11-28 18:42:09
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换。     ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 一:其中上图的第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换

【转帖】龙芯3A3000处理器深度评测:和Intel、AMD差距巨大

老子叫甜甜 提交于 2019-11-28 12:13:23
龙芯3A3000处理器深度评测:和Intel、AMD差距巨大 https://www.eefocus.com/mcu-dsp/424623/r0 作者非计算机科班毕业 让我汗颜。 我计算机毕业都不知道那么多评测软件。。 2017年九月份 龙芯 俱乐部办了一个龙芯3A主板的团购。作为多年关注龙芯的爱好者,我参加了这次团购,购买了一个龙芯3A3000的主板。鉴于目前龙芯3A4000处理器即将流片,而目前对即将过气的龙芯3A3000处理器的性能并没有一个比较详细的评测,我使用phronix-test-suite对龙芯3A3000处理器做了一个尽可能理性、中立、客观、全面的评测,不吹不黑,不夸大成绩也不回避问题。 龙芯3A3000主板介绍 首先,还是晒晒图,回顾一下龙芯3A3000主板的模样。 图1龙芯3A3000主板照片,风扇下面是龙芯的CPU。另外两块散热片下面分别是南桥和北桥。 图2拆下风扇后,龙芯3A3000 CPU的近照,其中的LS3A3000D-LP意思是说这是一个低功耗版本的龙芯3A3000CPU 我拿到的这块龙芯3A3000处理器不是性能最高的1.5GHz主频版本,而是性能略低的1.4GHz版本。因此,在估算龙芯3A3000(1.5GHz)的性能时,应该将我的测试结果乘以1.07。此外,需要说明的是龙芯3A3000笔记本里带的龙芯3A3000的主频被限制在了1.2GHZ。