多进程

多进程 VS 多线程 VS 线程池 VS EventLoop

天涯浪子 提交于 2020-04-30 19:58:16
多进程 VS 多线程 VS 线程池 VS EventLoop 在现在的编程过程中,经常听到多进程,多线程,线程池,EventLoop 的概念,选择一个正确的驱动模型,有助于提升代码的性能。 注:本文仅仅讨论并发的情况。 进程和线程 进程:操作系统中 资源管理对象 ,管理虚拟内存,文件句柄,线程等资源,但是 进程不是执行单元 。 线程: 具体的执行单元 。CPU是实际的物理执行单元,通过 寄存器 可以控制CPU执行的代码以及状态。而线程就是包含了一个任务的CPU上下文(寄存器),任务状态(就绪|阻塞|运行),所属用户等信息的对象。操作系统接收到时间中断(INT)后, 通过轮转线程中的CPU上下文(寄存器)信息,实现了多任务的轮转 。 多进程 多进程:针对并发请求,一个请求开启一个进程进行处理。早起CGI就是这么干的。 代表:早期PHP,CGI类 优点: 一个业务进程奔溃不影响另外一个业务进程,从操作系统层面上隔离业务执行 如果进程采用Socket之类的RPC调用,那么非常容易部署到网络环境上 缺点: RPC调用比较难以编写 频繁的开启和关闭进程,性能比较差 不允许内存共享(排除内核支持情况) 多线程 多线程:针对不同的业务逻辑,并发的开启多个线程进行执行。 代表:早期 Tomcat Bio模型 优点: 内存是共享的 编写并发模型比较方便 有效的利用多核CPU 缺点: 并发量过大的时候

python的多线程、多进程、协程用代码详解

醉酒当歌 提交于 2020-04-06 16:39:40
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用 多进程、多线程、协程 来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。 同步 首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1函数可以设定循环次数,每次循环将当前循环数(从0开始)和url传入parse_2函数。 性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待 示例代码就是典型的串行逻辑,parse_1将url和循环数传递给parse_2,parse_2请求并返回状态码后parse_1继续迭代一次,重复之前步骤 多线程 因为CPU在执行程序时每个时间刻度上只会存在一个线程,因此多线程实际上提高了进程的使用率从而提高了CPU的使用率 实现多线程的库有很多,这里用concurrent.futures中的ThreadPoolExecutor来演示

python中多线程与多进程中的数据共享问题

感情迁移 提交于 2020-03-20 23:25:27
之前在写多线程与多进程的时候,因为一般情况下都是各自完成各自的任务,各个子线程或者各个子进程之前并没有太多的联系,如果需要通信的话我会使用队列或者数据库来完成,但是最近我在写一些多线程与多进程的代码时,发现如果它们需要用到共享变量的话,需要有一些注意的地方 多线程之间的共享数据 标准数据类型在线程间共享 看以下代码 #coding:utf-8 import threading def test(name,data): print("in thread {} name is {}".format(threading.current_thread(),name)) print("data is {} id(data) is {}".format(data,id(data))) if __name__ == '__main__': d = 5 name = "杨彦星" for i in range(5): th = threading.Thread(target=test,args=(name,d)) th.start() 这里我创建一个全局的int变量d,它的值是5,当我在5个线程中调用test函数时,将d作为参数传进去,那么这5个线程所拥有的是同一个d吗?我在test函数中通过 id(data) 来打印一下它们的ID,得到了如下的结果 in thread <Thread(Thread

python多进程完成模拟支付

别等时光非礼了梦想. 提交于 2020-03-18 15:41:23
#!/usr/bin/python # -*- coding: UTF-8 -*- '''@auther :mr.qin @IDE:pycharm''' from tool.Common import * from tool.request_data_change_to_StrEncode import request_data_change_to_str from tool.tencent_cloud_mysql_connect import Mysql_operation import time import requests from multiprocessing import Process,Queue,Pool,Manager,Lock import os my_op = Mysql_operation() get_data = '''select order_id,order_sn from order_info limit 100;''' data = my_op.sql_operation(get_data) data_to_str = request_data_change_to_str() lock=Lock() def testDoWeChatNotify(q): fwh_order_dict = {} fwh_order_id_list, fwh

面试问题--找工作的历程

不羁的心 提交于 2020-03-12 08:44:42
近期找工作的过程中,因为自己比较喜欢C/C++,对多线程以及网络方面比较熟悉, 所以下面的这些问题是这段时间在面试过程中被问到了,现在对这些问题进行了汇总!! 面试过程真的是一个非常好的学习过程,下面那些问题自己现在基本可以解决, 我的答案或者观点就不给出了,看到这篇文章的同学可以根据自己的情况,测试一下自己....哈哈... 也可以当成一次学习的过程,网上搜索出来的结果可能会更详细。。。动手吧。。。 一、网络(主要是TCP/UDP) (1)、TCP的三次握手连接:两端主机状态(SYN_SEND,SYN_RECV,ESTABLISH),数据包类型(SYN,ACK),整体过程 (2)、TCP的四次挥手:主机状态(FIN_WAIT_1,FIN_WAIT_1,TIME_WAIT,CLOSE_WAIT,LAST_ACK,CLOSED),数据包类型(FIN,ACK), 问题1:TIME_WAIT状态有什么用?时间有多长? 问题2:四次挥手中,服务端接收到FIN包后,回应ACK包后,还能否继续发送数据?为什么服务端把ACK包和FIN包分开发送? 问题3:TCP协议的REST包有什么用? 问题4:TCP协议里的PSH包和URG包的区别? 问题5:TCP包中紧急指针有什么用?那部分为紧急数据? 问题6:TCP的可靠传输机制有哪些? 问题7:TCP和UDP以及IP三者的区别? 问题8

进程池创建多进程

风流意气都作罢 提交于 2020-03-12 05:57:28
进程池产生的原因: 【1】 进程的创建和销毁过程消耗的资源较多 【2】 当任务量众多,每个任务在很短时间内完成时,需要频繁的创建和销毁进程。此时对计算机压力较大 【3】 进程池技术很好的解决了以上问题。 原理 创建一定数量的进程来处理事件,事件处理完进 程不退出而是继续处理其他事件,直到所有事件全都处理完毕统一销毁。增加进程的重复利用,降低资源消耗。 from multiprocessing import Pool from time import sleep, ctime # 进程池事件 def worker(msg): sleep(2) print(ctime(), '--', msg) # 创建进程池 pool = Pool() # 向进程池放事件 for i in range(10): msg = "Tedu%d" % i pool.apply_async(func=worker, args=(msg,)) # 关闭进程池 不能再添加新的事件 pool.close() # 回收 pool.join() 来源: CSDN 作者: Uranus_user 链接: https://blog.csdn.net/Uranus_user/article/details/104806860

基于pcntl的PHP进程池

筅森魡賤 提交于 2020-03-11 11:24:06
想必大家都知道可以通过多进程或者多线程的方式实现异步。 PHP多进程编程当前主要有这几种方式, 1>基于pcntl实现多进程,这也是PHP自带的多进程玩法 2>Swoole自己修改PHP内核代码,从而实现多进程,这个看起来比较新 2>Swoole自己修改PHP内核代码,从而实现多进程 inple_fork这个库,实现了多进程和进程池。 一,安装 用composer安装。 composer require jenner/simple_fork 二,使用 simple_fork这个库自带了很多内容,在此主要跟大家分享进程和进程池的使用,其他内容可以自行查看demo。 没有用过composer的朋友,需要根据自己的代码路径,导入autoload.php,在此略过。 需要在命令行下运行。 1,进程 使用步骤大致如下: #1,任务是一个实现了Runnable接口的类,或者直接用callback也可以。 #2,初始化子进程Process,并把任务实例作为参数传递过去 #3,最后start开启子进程,wait用于等待子进程运行结束(否则会出现僵尸进程)。 用起来也很简单 use Jenner\SimpleFork\Runnable; use Jenner\SimpleFork\Process; class Task implements Runnable { /** * @return void

swoole之 swoole_process 应用于TP框架

南楼画角 提交于 2020-03-10 11:05:28
swoole_process 实现了多进程的管理,多个进程同时进行采集任务, 公司的框架比较low,用的tp框架,结合tp框架实现多进程的采集 这是swoole好的学习资源 https://segmentfault.com/a/1190000002946586 1 /** 2 * 用swoole多进程方法进行采集 3 * 采集网贷天眼下各个平台的数据,由于网贷天眼的平台的每个参数指标对应一个ajax请求, 4 * 所有设计每个参数指标对应一张表,这样看起来虽然比较繁琐,但有助于数据的更新和维护. 5 * 先循环遍历出url表中所有的属于网贷天眼的url,和cid,调用各个抓取参数方法,进行 6 * 入库操作 7 */ 8 public function addDataSwoole() 9 { 10 11 for ($i = 0; $i < 14; $i++) { 12 13 $process = new \swoole_process([$this, 'swooleGetContents'], true); 14 $start = $process->start(); 15 $process->write($i); 16 $workers[$start] = $process; 17 } 18 19 //防止产生僵尸进程. 20 while (true) { 21 $res =

Nginx的架构及工作流程

て烟熏妆下的殇ゞ 提交于 2020-03-08 14:47:23
NGINX是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器。 NGINX以其高性能,稳定性,丰富的功能集,简单的配置和低资源消耗而闻名,也是为解决 C10K问题 而编写的服务器之一。本文主要介绍Nginx的架构及工作流程。 一、Nginx的架构如下图 1.nginx启动后会有一个master进程和多个worker进程(woeker进程数量可配置,一般设置与机器的核心数一致),master进程负责管理worker进程(接收外界信号,发送信号到各worker进程,监控worker进程的运行状态)。 2.基本的网络事件,由worker进程负责处理,各worker进程之间是对等和相互独立的,共同竞争来至客户端的请求。 3.nginx是基于多进程模式、事件驱动的异步非阻塞IO模型。 二、nginx多进程+异步非阻塞IO模型的优点 1.进程之间相互独立,一个进程异常,其他进程不会受到影响,能够继续服务,保证服务的稳定性。 2.独立进程之间资源隔离,避免了很多不必要的锁操作,提高程序处理效率。 3.避免了多线程模型下常见的上下文切换问题,虽然多进程模型会导致服务并发数降低,但异步非阻塞IO解决了这个问题。 三、多进程间如何协作 1.多进程工作可能会产生的‘ 惊群效应 ’问题 多进程工作模式如下图: 一个连接进来,每个worker进程都有可能处理这个连接

python多进程multiprocessing模块中Queue的妙用

被刻印的时光 ゝ 提交于 2020-03-08 13:21:25
  最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process。Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度。之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条。但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小爬决定使用Tkinter库来制作进度条,进而摆脱对chrome浏览器的依赖。   要制作进度条,就得有计数器存储爬虫的总数,当前的爬取数甚至是当前的耗费时间等作为存储变量。考虑到各个进程之间无法直接通信,这个当前量和总量如何得到,就只能借助multiprocessing中的Queue类了。根据官方文档,multiprocessing中的Queue 类几乎完美克隆了Queue.Queue中的功能,但是它是专为多进程间的通信单独设计的。 透过一个简单的例子看下Queue是如何运用的: from multiprocessing import Process, Queue def f(q): q.put([42, None, 'hello']) if __name__ == '__main__'