多进程

(转)编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程

十年热恋 提交于 2020-02-29 05:33:23
1、什么是线程 什么是线程?线程与进程与有什么关系?这是一个非常抽象的问题,也是一个特别广的话题,涉及到非常多的知识。我不能确保能把它讲的话,也不能确保讲的内容全部都正确。即使这样,我也希望尽可能地把他讲通俗一点,讲的明白一点,因为这是个一直困扰我很久的,扑朔迷离的知识领域,希望通过我的理解揭开它一层一层神秘的面纱。 2、任务调度 线程是什么?要理解这个概念,须要先了解一下操作系统的一些相关概念。大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发(别觉得并发有多高深,它的实现很复杂,但它的概念很简单,就是一句话:多个任务同时执行)。多任务运行过程的示意图如下: 图 1:操作系统中的任务调度 3、进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件

进程和线程

≯℡__Kan透↙ 提交于 2020-02-28 06:45:00
进程和线程: 1、进程概念: 进程:就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、数据栈以及其他用于跟踪进程执行的辅助数据,操作系统管理所有进程的执行,为它们合理的分配资源。进程可以通过fork或spawn的方式来创建新的进程来执行其他的任务,不过新的进程也有自己独立的内存空间,因此必须通过进程间通信机制(IPC,Inter-Process Communication)来实现数据共享,具体的方式包括管道、信号、套接字、共享内存区等。 2、线程概念: 一个进程还可以拥有多个并发的执行线索,简单的说就是拥有多个可以获得CPU调度的执行单元,这就是所谓的线程。 3、多进程概念: Unix和Linux操作系统上提供了 fork() 系统调用来创建进程,调用 fork() 函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。 fork() 函数非常特殊它会返回两次,父进程中可以通过 fork() 函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了 fork() 函数。由于Windows系统没有 fork() 调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的 Process 类来创建子进程,而且该模块还提供了更高级的封装

并发与并行

我只是一个虾纸丫 提交于 2020-02-27 09:05:02
并行和串行: 串行:一次只能取得一个任务并执行这一个任务 并行:可以同时通过多进程/多线程的方式取得多个任务,并以多进程或多线程的方式同时执行这些任务 注意点: 如果是单进程/单线程的并行,那么效率比串行更差 如果只有单核cpu,多进程并行并没有提高效率 从任务队列上看,由于同时从队列中取得多个任务并执行,相当于将一个长任务队列变成了短队列 并发: 并发是一种现象:同时运行多个程序或多个任务需要被处理的现象 这些任务可能是并行执行的,也可能是串行执行的,和CPU核心数无关,是操作系统进程调度和CPU上下文切换达到的结果 解决大并发的一个思路是将大任务分解成多个小任务: 可能要使用一些数据结构来避免切分成多个小任务带来的问题 可以多进程/多线程并行的方式去执行这些小任务达到高效率 或者以单进程/单线程配合多路复用执行这些小任务来达到高效率 来源: oschina 链接: https://my.oschina.net/u/4167465/blog/3170816

2020-02-26 今天学了啥?

做~自己de王妃 提交于 2020-02-27 01:44:35
/*--> */ /*--> */ /*--> */ /*--> */ Chrome进程架构,打开一个浏览器有多少进程? 一、2007年之前,浏览器就是单进程的,不稳定、不流畅、不安全 二、早期多进程浏览器(主进程、渲染进程、插件进程) 1、进程之前相互隔离,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面 2、采用多进程架构的额外好处是可以使用安全沙箱 3、JavaScript 也是运行在渲染进程中的,所以即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面 三、目前多进程浏览器 架构有:主进程、GPU进程、网络进程、渲染进程、插件进程 主进程负责界面显示、用户交互、子进程管理,同时提供存储等功能; GPU进程使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制; 渲染进程核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,渲染进程都是运行在沙箱模式下,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程; 网络进程主要负责页面的网络资源加载; 插件进程主要负责插件的运行 通常我们会遇到单个页面卡死导致浏览器会崩溃是因为对于同源的页面,是共享一个渲染进程

多进程爬虫python——实例爬取酷狗歌单

天大地大妈咪最大 提交于 2020-02-24 14:22:33
多线程和多进程概述:当计算机运行程序时,就会创建包含代码和状态的进程。这些进程会通过计算机的一个或多个CPU执行。不过,同一时刻一个CPU只能执行一个进程,然后在不同进程间快速切换,这样就给人以多个程序同时运行的感觉。同理,在一个进程中,程序的执行也是在不同线程间进行切换的,每个线程执行程序的不同部分。例如,一个工厂(网络爬虫)有多个车间(进程)负责不同的功能,一个车间又有多个车间工人(线程)协同合作,效率大大提升。 from multiprocessing import Pool pool=Pool(processes= num)#创建进程池,num为进程个数 pool.map(func,iterable)#func为爬虫函数,iterable为迭代参数,爬虫中,可为多个url列表进行迭代 实例:爬取酷狗歌单(做测试只返回不储存) import requests #用于请求网页获取网页数据 from bs4 import BeautifulSoup #解析网页数据 import time #time库中的sleep()方法可以让程序暂停 import csv from multiprocessing import Pool ''' 爬虫测试_多进程 酷狗top500数据 写入csv文件 ''' ''' fp = open('D://kugou.csv','wt',newline=

线程概念

橙三吉。 提交于 2020-02-22 19:39:01
一、多线程 多线程的处理思路 :一个运行中的程序中,具有多个执行流,各自完成一个功能模块的实现 linux的操作系统中 :认为一个pcd就是一个执行流(pcd是操作系统调用一段程序运行的 实体–描述了程序的运行过程) linux下的线程就是一个pcd pcd:是一个进程 现在,多个pcd可以共用同一个虚拟地址空间,这些pcd共用了一个运行中程序的资源 linux下的线程就是一个pcd是一个轻量级进程,因为一个运行中程序的多个pcd共用同一 份资源 一个运行中的程序就是一个进程,以前我们所说的进程,这时候再来解释,就是具有一个线程的进程,linux下的线程是一个pcb(轻量级进程),是一个进程中的一条执行流; 进程就是一个线程组 ; 二、进程/线程 1、进程跟线程是要一起说的(否则单一说会有一种冲突感) 2、进程就是一个运行中的程序,操作系统会创建一个pcb(运行中程序的描述),并且分配资 源,通过pcb来调度运行整个程序 3、线程是一个进程中的执行流,但是linux下实现进程中的执行流的时候,使用了pcb实现 4、因此就说linux下的线程是一个pcb,称作轻量级进程,因为同一个进程中的线程共用进程 分配的资源 5、而进程就是所有线程的统称,就是一个线程组,系统在运行程序,分配资源的时候是分 配给线程组,分配给整个进程 进程是资源分配的基本单位,线程是cpu调度的基本单位 三、

Python高级编程-多进程

戏子无情 提交于 2020-02-22 15:09:58
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个 fork() 系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是 fork() 调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。 子进程永远返回 0 ,而父进程返回子进程的ID 。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用 getppid() 就可以拿到父进程的ID。 Python的 os 模块封装了常见的系统调用,其中就包括 fork ,可以在Python程序中轻松创建子进程: 1 # /usr/bin/python 2 import os 3 import time 4 5 6 def main(): 7 pid = os.fork() 8 if pid == 0: # 子进程中返回0 9 print("I am child process %d, my parent is %d" % (os.getpid(), os.getppid())) 10 time.sleep(1) 11 else: # 父进程中返回子进程id 12 print("I %d just created child %d"

gdb调试多进程程序——gdb attach用法

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-19 18:30:10
前一阵在调试多进程mpi死锁的bug,多进程程序只靠输出来定位bug是一件相当麻烦的事=.=!,后来发现可以用gdb attach来调试多进程程序。 原来一直用gdb调试单进程的程序,感觉打开了新世界的大门哈哈哈。 下面介绍如果用gdb attach调试正在运行的程序,用法如下。 第一步:运行多进程程序。 首先正常运行多进程程序。在发生mpi死锁之后,不要停掉程序!! 第二步:获得运行程序的所有pid。 开启另一个窗口,输入 ps -aux | grep 可执行文件名,此时屏幕上会打印出运行程序的信息。 例:运行两个进程的程序,会出现如下3条信息,可以分为两类,一类是运行程序的信息,另一类是grep搜索进程的信息。可以通过最后一列来区分。 下面3条信息中最后一列为运行命令的为前两条命令是我们需要关注的命令。 进程的pid在第二列,此时两个进程的pid分别为209947 和209959。 $ ps aux | grep test z 209947 0.1 0.0 431664 5552 pts/91 Sl+ 16:52 0:00 运行命令 z 209959 0.0 0.0 92984 596 pts/91 S+ 16:52 0:00 运行命令 z 211971 0.0 0.0 109584 956 pts/92 S+ 16:53 0:00 grep test 第三步

RuntimeError: DataLoader worker (pid(s) 9528, 8320) exited unexpectedly

时光怂恿深爱的人放手 提交于 2020-02-18 03:27:24
原文地址 分类目录——Pytorch 关键词: Data.DataLoader 、 num_workers 、 batch Pytorch在开进行小批量数据下降时开多进程报错 报错内容 RuntimeError: DataLoader worker (pid(s) 9528, 8320) exited unexpectedly 去网上搜教程,说是在loader定义的时候多进程的参数指定的问题,我的loader定义如下 loader = Data . DataLoader ( dataset = torch_dataset , # torch TensorDataset format batch_size = BATCH_SIZE , # mini batch size shuffle = True , # 要不要打乱数据 (打乱比较好) num_workers = 2 , # 多线程来读数据 ) 其中 num_workers 是用来指定开多进程的数量,默认值为 0 ,表示不启用多线程。 网上给出的解决方案是 设置 num_workers=0; 或者 删掉这个属性的设置(也就是取默认值0) 但是这终归是个意淫的解决方式,当遇到大量数据处理时,势必要采用并行的处理方式才是科学高效的。 最终在 这里 找到了解决方案,就是把含有多线程操作的部分放在 if __name__ == '_

python基础教程:用map函数来完成Python并行任务的简单示例

蹲街弑〆低调 提交于 2020-02-15 22:44:45
这篇文章主要介绍了用map函数来完成Python并行任务的简单示例,多线程和多进程编程的问题一直都是Python中的热点和难点,需要的朋友可以参考下 众所周知,Python的并行处理能力很不理想。我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当。大多数关于Python线程和多进程的教材虽然都很出色,但是内容繁琐冗长。它们的确在开篇铺陈了许多有用信息,但往往都不会涉及真正能提高日常工作的部分。 经典例子 DDG上以“Python threading tutorial (Python线程教程)”为关键字的热门搜索结果表明:几乎每篇文章中给出的例子都是相同的类+队列。 事实上,它们就是以下这段使用producer/Consumer来处理线程/多进程的代码示例: #Example.py '' ' Standard Producer/Consumer Threading Pattern ' '' import time import threading import Queue class Consumer ( threading.Thread ) : def __init__ ( self, queue ) : threading.Thread.__init__ ( self ) self._queue = queue def