taoyx.log co"> python廖雪峰_【Python】python中实现多进程与多线程 - 11GX
首页 > python廖雪峰_【Python】python中实现多进程与多线程

python廖雪峰_【Python】python中实现多进程与多线程

81c9a112a5e57d514176bb4c7b675648.png

进程与线程

进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1]。比如,打开一个word文件就是启动了一个word进程。

线程(thread)是进程内的子任务。比如word中可以进行编辑、拼写检查和打印等子任务。

我们目前的操作系统都是多任务的操作系统,多任务的实现方式[2]:

  • 多进程
  • 多线程
  • 多进程 + 多线程

多进程:multiprocessing模块

Unix Like[3]系统中,可以用python中os模块的os.fork()方法,为当前进程创建一个“子进程”[4],当前进程称作“父进程”。

说的简单一点,就是当你调用os.fork()以后,会有两个进程运行这之后的代码,它们的pid(process id)不一样。

由于一些玄学或是一些不知名的原因,用这个方法以后,我心爱的mbp风扇呼呼响,所以只好作罢。

multiprocessing模块比os.fork()好用的多,这个模块也可以用于创建多进程。而且它有一些基本的对象如Queue等支持进程间通信。下面主要讨论用multiprocessing模块怎么实现多进程。

  • 创建一个子进程

multiprocessing.Process类可以初始化一个子进程,target参数传入子进程函数。

from multiprocessing import Process
import os, time# 子进程函数
def sub_process():print('Sub Process (%s) Start!' % os.getpid())for i in reversed(range(3)):time.sleep(1)print(i+1)time.sleep(1)print('Over!')print('Main Prcess (%s) Start!' % os.getpid())
for i in reversed(range(3)):time.sleep(1)print(i+1)
time.sleep(1)
print('GO!')
time.sleep(1)
p = Process(target=sub_process)
# 子进程开始
p.start()
# 等待子进程结束
p.join()

代码执行的效果如下:

ee5e1b44465e360b0b5485d77fc9e6f6.png
python创建一个进程https://www.zhihu.com/video/1060526231002390528
  • 创建多个子进程

multiprocessing.Pool类可以创建一个进程池,进程吃通过调用apply_async函数来创建一个新的进程。

from multiprocessing import Pool
import os,timedef sub_process(n):time.sleep(1)print('Process (%s) is running!' % os.getpid())# 指定同时运行的进程数
p = Pool(4)
for i in range(5):p.apply_async(sub_process,args=(i+1,))
# 不能继续添加进程了
p.close()
p.join()
e40d310d903dc2b3059b7419ef972f4e.png
python进程池https://www.zhihu.com/video/1060539118525841408

可以清晰的看见,我们指定了同时运行的进程数为4,因此最开始添加的4个进程都停了1秒就有了输出,而最后一个进程在1秒以后才有输出。

多线程:threading模块

多线程相比于多进程的好处是能更快一点,但是也没快多少。python中常用threading模块实现多线程。

import threading, timedef thread():print('%s is running' % threading.current_thread().name)print('%s is running' % threading.current_thread().name)
time.sleep(1)
t = threading.Thread(target=thread, name='Sub_Thread')
t.start()
t.join()

后记

当然多进程和多线程的内容远不止这些,其他的还有进程间通信、线程中的锁、ThreadLocal等。由于立下了一天写一篇文章的flag,如果一开始就把这件事搞的非常复杂就会损失做这个事的乐趣。所以我打算偷点懒,少点写,以后再增加工作量~

Ref.

[1] 百度百科:进程

[2] 廖雪峰python教程:进程与线程

[3] 《鸟哥的Linux私房菜》

[4] 廖雪峰python教程:多进程

更多相关:

  • 在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广度和深度。本文从浏览器角度来告诉你,URL后输入后按回车,浏览器内部究竟发生了什么,读完本文后,你将了解到:浏览器内有哪些进程,这些...

  • 运行cmd netstat -aon|findstr 80 然后 taskkill -f -pid 32428(这个就是pid进程编号) 回车   进程死翘翘了~ 去愉快玩耍吧~哦对了 别忘记一健三联关注我哟~...

  • 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网...

  • 1.      SIGTERM “kill pid” 会发送SIGTERM到进程pid. This is the termination signal sent by killcommand by default. 2.      SIGINT 在终端中敲入interrupt key(DELETE或ctrl+c)会产生SIG...

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...

  • #coding:utf-8'''Created on 2017年10月25日@author: li.liu'''import pymysqldb=pymysql.connect('localhost','root','root','test',charset='utf8')m=db.cursor()'''try:#a=raw_inpu...

  • python数据类型:int、string、float、boolean 可变变量:list 不可变变量:string、元组tuple 1.list list就是列表、array、数组 列表根据下标(0123)取值,下标也叫索引、角标、编号 new_stus =['刘德华','刘嘉玲','孙俪','范冰冰'] 最前面一个元素下标是0,最...

  • from pathlib import Path srcPath = Path(‘../src/‘) [x for x in srcPath.iterdir() if srcPath.is_dir()] 列出指定目录及子目录下的所有文件 from pathlib import Path srcPath = Path(‘../tenso...

  • 我在使用OpenResty编写lua代码时,需要使用到lua的正则表达式,其中pattern是这样的, --热水器设置时间 local s = '12:33' local pattern = "(20|21|22|23|[01][0-9]):([0-5][0-9])" local matched = string.match(s, "...

  • 在分析ats的访问日志时,我经常会遇到将一些特殊字段对齐显示的需求,网上调研了一下,发现使用column -t就可以轻松搞定,比如 找到ATS的access.log中的200响应时间过长的日志 cat access.log | grep ' 200 ' | awk -F '"' '{print $3}' > taoyx.log co...