多进程

Python中使用多进程来实现并行处理的方法小结

依然范特西╮ 提交于 2020-02-14 00:02:35
Python中使用多进程来实现并行处理的方法小结 进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 2.关系 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 3.区别 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 简而言之,一个程序至少有一个进程

python 学习笔记 多进程

こ雲淡風輕ζ 提交于 2020-02-13 21:15:57
要让python程序实现多进程,我们先了解操作系统的相关知识 Unix/Linux操作系统提供了一个fork()系统调用,他非常特殊,普通的函数调用,调用一次,返回一次,但是fork调用一次, 返回两次,因为操作系统自动把当前进程称为父进程复制了一份,然后,分别在父进程和子进程返回。 子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以父进程要记下来 子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的id Python的OS模块封装了常见的系统调用,其中就包括fork,可以在python程序中轻松创建子进程 import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork() if pid == 0: print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) else: print('I (%s) just created a child process (%s).' % (os.getpid(), pid)) 有了 fork 调用

Python多进程

 ̄綄美尐妖づ 提交于 2020-02-12 12:01:59
Python多进程的使用 上篇中讲到多线程的使用,这篇就说说多进程的使用,就目前的情况来看,多进程在某些情况下可以替代多线程来实现多核并行。 首先,在使用多进程前,我们需要了解什么是进程? 进程是资源分配的最小单位,也是线程的容器。在python中,我们是如何使用进程的呢? import multiprocessing #导入模块 process_obj=multiprocessing.Process(target=目标函数名) #创建一个进程对象 process_obj.start() #启动进程 值得注意的是,进程和线程是完全不一样的,线程可以共享全局变量,而进程则是将主进程的资源copy了一份,所以进程会更消耗资源,它们之间无法进行资源共享,具体会涉及到消息队列,稍后会讲解。 那么使用多进程是否真的比我们多线程更快呢? import threading import time def run1(): a=1 for i in range(1000000): a+=1 print(a) def run2(): b=1 for i in range(1000000): b+=1 print(b) def main(): start_time=time.perf_counter() t1=threading.Thread(target=run1) t2=threading

aiohttp与aiomultiprocess结合使用

不问归期 提交于 2020-02-10 22:23:08
aiohttp与aiomultiprocess结合使用 这是之前听大神讲异步的时候看到的一篇教程,后来又查了一些资料,汇总了一下,先记下来,后续用到了再深入研究。 AsyncIO和多进程处理本身是有用的,但是有局限性:AsyncIO仍然不能超过GIL的速度,而且一次只能处理一个任务。但是,只要结合在一起,他们就能充分发挥自己的潜力。 aiomultiprocess提供了一个简单的接口,同时在每个子进程上运行一个完整的AsyncIO事件循环,支持Python应用程序中从未有过的并发级别。每个子进程可以同时执行多个协程,仅受工作负载和可用内核数量的限制。 aiohttp 异步request方法 async def aiohttp_get ( num ) : """ aiohttp 获取get方法 :param num: :return: """ headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0' , } params = { "num" : num } async with aiohttp . request ( "GET"

Python多进程

别等时光非礼了梦想. 提交于 2020-02-10 21:19:58
目录 Python多进程 Multiprocessing使用简介-1 Process 多进程的几种方法 Lock Pool Queue Python—队列、生产者消费者模型 @ Python多进程 • 用multiprocessing替代Thread • multiprocessing库的出现很大程度上是为了弥补thread库因为GIL低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,完全并行,无GIL的限制(进程中包括线程),可充分利用多cpu多核的环境,因此也不会出现进程之间的GIL争抢。 • python多进程并发,模块名称:multiprocessing • python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 • 借助这个包,可以轻松完成从单进程到并发执行的转换。 • 导入方式: import multiprocessing Multiprocessing使用简介-1 • multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该Process对象与Thread对象的用法相同,也有start()

python并行运行

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-10 16:39:31
源于: 执行类代码 – MainOne.py – 函数main_faker    为保证多线程数据安全,python语言的设计中,有个全局解释锁 GIL(global interpretor lock) ,每个线程在开始运行时必须获得锁,遇到I/O或sleep挂起时释放锁,从而保证同一时刻只有一个线程在运行,多个线程在不同的时间片上执行,达到多任务的目的,使python具有 并发 能力,使得python可以充分使用CPU的单个核心。多线程并发在python网络爬虫中使用普遍,可以一次性开启大量下载任务,而大部分任务都在等待I/O的状态,比单线程速度快很多倍,另外,使用协程也能达到到多线程的的效果。    我们希望提高效率,充分利用多核CPU的优势,同时执行多个任务,做到多任务 并行 ,应该怎样做呢?既然绕不开GIL,解决方案有: 1. 使用多进程,开启多个python实例,使用进程池 2.用C/C++写出多线程代码,通过cython调用;或者将C/C++编译成dll文件(linux下为so文件),通过ctypes模块直接调用其中的代码;用python的C接口写拓展,或者用Boost.Python等。 3.换解释器,不用C语言版的Pyhton,而是使用jpython(java),pypy(python),ironpython(C#)等 python多线程demo import

php多线程的优点有哪些

北战南征 提交于 2020-02-08 14:23:29
  php多线程的优点如下:   1、使用多进程, 子进程结束以后,内核会负责回收资源。   2、使用多进程, 子进程异常退出不会导致整个进程Thread退出,父进程还有机会重建流程。   (相关学习视频教程推荐:php视频教程) 太原代孕威信15023219993   3、一个常驻主进程, 只负责任务分发, 逻辑更清楚。   4、多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。   5、共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。   6、消息队列, 合肥代孕威信15023219993 可以采用多个子进程抢队列模式,性能很好。   相关文章教程推荐:php教程   以上就是php多线程的优点有哪些的详细内容,更多请关注php中文网其它相关文章! 来源: https://www.cnblogs.com/ipengrui1/p/12283212.html

爬虫高性能相关

你离开我真会死。 提交于 2020-02-07 16:30:48
前言 之前讨论过python中多线程和多进程的不同。 由于我们使用的python解释器是Cpython,并不是线程安全的,所以python解释器为了解决这个问题,引入了GIL全局解释器锁。这导致了在同一个进程(一个python解释器下)并不能真正的实现多线程的并行执行,在某一确定的时刻永远只有一个线程在运行。 由此我们可以讨论: 1.当一个程序是I/O密集型时,是该采用多线程还是应该采用多进程? 我们知道当程序进入I/O(阻塞态)时,操作系统会自动剥夺我们程序的CPU使用权。如果我们程序采用多进程,即使给我们的程序分配另外的cpu,操作系统一样会剥夺其对CPU的使用权,这就导致了虽然我们消耗了很多的资源,但几乎对程序的性能没有提升。所以我们应该采用多线程。 2.当一个程序是计算密集型时,是该采用多线程还是应该采用多进程? 计算任务总是由cpu执行,如果我们的计算密集型程序采用多线程,虽然各个计算任务好像在并发执行,但是单位时间内cpu的计算次数是几乎固定的。这就导致了,性能没有额外的提升还额外多了线程之间的切换所带来的开销。 一、同步、异步、回调机制 1.同步调用 import requests def parse_page(res): print('解析 %s' %(len(res))) def get_page(url): print('下载 %s' %url)

Python中多进程、多线程、协程区别和应用场景

﹥>﹥吖頭↗ 提交于 2020-02-07 04:42:10
面试很容易问到,千万别混淆: 多进程适合在CPU 密集型操作(cpu 操作指令比较多,如科学计算,位数多的浮点运算) 多线程适合在IO 密集型操作(读写数据操作较多的,比如爬虫) 线程是并发,进程是并行;进程之间相互独立,是系统分配资源的最小单位,同一个进程中的所有线程共享资源。 进程:一个运行的程序或代码就是一个进程,一个没有运行的代码叫程序。进程是系统进行资源分配的最小单位,进程拥有自己的内存空间,所以进程间数据不共享,开销大。 线程:调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程的存在而存在,一个进程至少有一个线程,叫主线程,多个线程共享内存(数据共享和全局变量),因此提升程序的运行效率。 协程:用户态的轻量级线程,调度有用户控制,拥有自己的寄存器上下文和栈,切换基本没有内核切换的开销,切换灵活。 来源: https://www.cnblogs.com/kaiping23/p/9618598.html

Python多线程与多进程

 ̄綄美尐妖づ 提交于 2020-02-07 03:00:31
Python多进程 1.用os.fock函数 2.使用multiprocessing模块 方法1只能在linux系统中使用 方法2提供了跨平台的多线程模块 #coding:utf-8 from multiprocessing import Process from time import sleep def func ( num ) : print '进程%d开始' % ( num ) sleep ( num ) print '进程结束' num = 5 for i in range ( 1 , num + 1 ) : p = Process ( target = func , args = ( i , ) ) p . start ( ) #p.join()#添加这句会等待子线程结束之后主线程再结束 还有通过继承的方式实现多进程 #coding:utf-8 from multiprocessing import Process from time import sleep def func ( num ) : print '线程%d开始' % ( num ) sleep ( num ) print '线程%d结束' % ( num ) class MyProcess ( Process ) : def __init__ ( self , num ) : super (