异步队列

【并发编程必备基础之进程】 -- 2019-08-09 10:08:23

巧了我就是萌 提交于 2019-11-26 16:02:46
原文: http://106.13.73.98/__/10/ 目录 1.操作系统背景知识 2.什么是进程 3.进程调度 4.进程的并行与并发 5.同步异步阻塞非阻塞 6.进程的创建与结束 1.操作系统背景知识 顾名思义 ,进程即正在执行的一个过程,进程是对正在运行的程序的一个抽象。进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老的最重要的抽象概念之一,操作系统的其他所有内容都是围绕进程的概念展开的。 所以想要真正了解进程,应先了解操作系统, 点击进入操作系统介绍 PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用+空间多路复用+硬件上支持分离),如果没有进程的抽象,现代计算机将不复存在。 必备理论基础 1.操作系统的作用: 1)隐藏复杂的硬件接口,提供良好的抽象接口. 2)管理,调度进程,并且将多个进程对硬件的抢夺变得有序 2.多道技术 1)产生背景:针对单核,实现并发 2)空间上的复用:如内存中同时有多道程序 3)时间上的复用:复用一个cpu的时间片,强调:遇到io切,占用cpu的时间过长也切,核心在于切之前将进程的状态保存下载,这样才能保证下次切换回来时能基于上次切走的位置继续运行. PS:现在的cpu一般都是多核的,同样,每个核都会用到多道技术

Laravel异步队列全攻略

微笑、不失礼 提交于 2019-11-26 14:05:05
最近项目需求,研究了laravel的异步队列。官方文档虽然很是详细,但也有些晦涩难懂,在此记录下步骤,供大家参考。 1、修改/config/queue.php文件 <?php return [ /* |-------------------------------------------------------------------------- | Default Queue Connection Name |-------------------------------------------------------------------------- | | Laravel's queue API supports an assortment of back-ends via a single | API, giving you convenient access to each back-end using the same | syntax for every one. Here you may define a default connection. | */ 'default' => env('QUEUE_CONNECTION', 'sync'), /* |------------------------------------------------------

python 进程

♀尐吖头ヾ 提交于 2019-11-26 10:26:50
理论 什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。[3] 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况

Windows完成端口基本介绍

我只是一个虾纸丫 提交于 2019-11-26 02:42:17
他是只能在Windows下的基于SOCKET事件管理的模型 与select不同,select需要多次重置管理句柄,IOCP只要一次 当我们想修改服务器端口时,iis7服务器监控工具可以简单的修改端口,检测503错误 有事件后select需要操作获取数据,而IOCP通知你的时候说明数据操作好了 select管理句柄的数目有限,IOCP没有限制 IOCP支持多线程同时等待。 我的设计思路一个线程用来侦听accept事件, 一个线程来侦听SOCKET的IO事件, 大部分框架都是这样, 其实可以只使用一个线程做异步SOCKET就完全足够了,现在 使用多线程来 就是看看这个IOCP的多线程用法, 在这之前先要了解下 异步通信 和 重叠I/O模型 我建议使用单线程 原因: 应为多个线程,拿到数据后,还是要发送到另外一个线程里面去, 然后做成事件队列, 也就是你线程拿到数据后, 还是要按队列线程,进行逻辑处理,多线程没意义。 2完成端口内部运行流程 完成端口的做法:事先开好几个线程,你有几个CPU我就开几个,首先是避免了线程的上下文切换,因为线程想要 执行的时候,总有CPU资源可用,然后让几个线程等着,等到有用户请求到来的时候,就把这些请求都加入到一个 公共消息队列中, 然后这几个开好的线程就排队逐一去从消息队列中取出消息并加以处理, 这种方式实现了 异步通信和负载均衡的问题

ConcurrentLinkedQueue实现异步日志写入

北战南征 提交于 2019-11-25 23:54:23
在用户操作量较大的情况下,如果实时写入日志会导致资源被严重占用,用户长时间获取不到返回结果,影响用户体验,所以日志操作通常是在用户操作完后放入异步队列,等用户操作少的时间段再将日志写入数据库。 此处实现异步日志写入用到了并发包下的ConcurrentLinkedQueue,一个线程安全的队列实现,遵循FIFO原则进行排序,采用CAS操作,来保证元素的一致性。 首先采用模板模式,定义一个异步队列服务的模板类BaseAsyncQueueService,其中包含一个队列log_queue,和异步操作的抽象方法asyncProcess()。 /** * 基础异步队列服务,用于异步保存日志信息 */ public abstract class BaseAsyncQueueService<T> { /** * 处理,消费 * @param t * @return */ public abstract boolean asyncProcess(T t); /** * 队列 */ private ConcurrentLinkedQueue<Object> log_queue; public BaseAsyncQueueService() { log_queue = new ConcurrentLinkedQueue(); } public synchronized boolean isEmpty(

高效爬虫

雨燕双飞 提交于 2019-11-25 19:34:24
目录 Gevent gevent基础之阻塞,非阻塞 同步,异步概念 同步异步与阻塞,非阻塞区别 Queue python内置Queue介绍 Gevent gevent基础之阻塞,非阻塞 1.gevent中一个很大的改进就是将阻塞IO改为非阻塞IO; 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回 非阻塞指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回 同步,异步概念 1.同步就是发生调用时,一定等待结果返回,整个调用才结束; 2.异步就是发生调用后,立即返回,不等待结果返回。被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。 同步异步与阻塞,非阻塞区别 1.阻塞/非阻塞, 它们是程序在等待消息(无所谓同步或者异步)时的状态; 2.同步/异步,是程序获得关注消息通知的机制。 要实现异步的爬虫方式的话,需要用到多协程。在它的帮助下,我们能实现前面提到的“让多个爬虫替我们干活” 它的原理是:一个任务在执行过程中,如果遇到等待,就先去执行其他的任务 当等待结束,再回来继续之前的那个任务。 在计算机的世界,这种任务来回切换得非常快速,看上去就像多个任务在被同时执行一样。 这就好比当你要做一桌饭菜,你可以在等电饭煲蒸饭的时候去炒菜。而不是等饭做好,再去炒菜。你还是那个你,但工作时间就这样被缩短了。多协程能够缩短工作时间的原理,也是如此