博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day10-多进程的基本语法
阅读量:6707 次
发布时间:2019-06-25

本文共 2227 字,大约阅读时间需要 7 分钟。

一、概述

  之前我们了解的线程,接下来我们学习多进程,进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程。进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的。

  英文解释如下:

   is a package that supports spawning processes using an API similar to the  module. The  package offers both local and remote concurrency, effectively side-stepping the  by using subprocesses instead of threads. Due to this, the  module allows the programmer to fully leverage multiple processors on a given machine. It runs on both Unix and Windows.

二、线程的使用场景

2.1、使用场景

  1. IO操作:不占用cpu的操作,比如:从磁盘上读块数据,从网络读块数据,从内存上读块数据都算是io的操作。
  2. 计算是占用cpu的,比如:计算1+1。线程利用上下文切换,也是消耗资源的。如果大量计算,用多线程就不快了,线程之前的来回切换,运算不要用。
  3. python的多线程不适合cpu的密集型操作的任务。但是,适合io密集型的任务,比如:socket_server 的使用。

三、进程

3.1、进程的定义

说明:用muliprocessing这个包中的Process来定义多进程,跟定义多线程差不多。

from multiprocessing import Process   #导入进程模块import timedef run(name):    time.sleep(2)    print("hello",name)if __name__ == "__main__":    p_obj_list = list()    #存放进程对象    for i in range(10):    #启动10个进程        p = Process(target=run,args=("qigao{0}".format(i),))  #产生一个进程实例        p.start()   #启动进程        p_obj_list.append(p)    for p in p_obj_list:        p.join()   #等待进程结果

3.2、进程中嵌入线程

说明:在进程中去嵌入线程

from multiprocessing import Processimport time,threadingdef thead_run(name):   #定义线程执行的方法    print("{0}:{1}".format(name,threading.get_ident()))def run(name):    time.sleep(2)    print("hello",name)    t = threading.Thread(target=thead_run,args=(name,))   #嵌入线程    t.start()   #执行线程if __name__ == "__main__":    p_obj_list = list()    for i in range(10):        p = Process(target=run,args=("qigao{0}".format(i),))        p.start()        p_obj_list.append(p)    for p in p_obj_list:        p.join()

3.3、父子进程

说明:每个子进程都是由一个父进程启动的,即便是我们这种程序也是有一个父进程的。

from multiprocessing import Processimport osdef info(title):    print(title)    print('module name:', __name__)    print('parent process:', os.getppid())    print('process id:', os.getpid())    print("\n\n")def f(name):    info('\033[31;1mfunction f\033[0m')    print('hello', name)if __name__ == '__main__':    info('\033[32;1mmain process line\033[0m')    p = Process(target=f, args=('bob',))    p.start()    p.join()

执行的结果:

总结:

  在Linux上执行这个父进程就是terminal自己,init 0所有的进程都是它启动的。

转载于:https://www.cnblogs.com/zhangqigao/articles/7301295.html

你可能感兴趣的文章
ACCESS-如何多数据库查询(跨库查询)
查看>>
java并发编程学习:用 Semaphore (信号量)控制并发资源
查看>>
HDU 2070 Fibbonacci Number
查看>>
Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView
查看>>
Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
查看>>
好玩的注释
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?原理简介-2(补充)...
查看>>
Maven编译代码的相关命令
查看>>
stingray 页面布局与设计
查看>>
江南白衣整理和开发的java常用工具类
查看>>
Android.mk 文件语法详解
查看>>
android的armeabi和armeabi-v7a
查看>>
android自己定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件
查看>>
emacs的常用配置备份
查看>>
lvs之 lvs+nginx+tomcat_1、tomcat_2+redis(lvs dr 模式)
查看>>
让js中的函数只有一次有效调用的三种常用方法
查看>>
python实现算24的算法
查看>>
Extending a logical volume in a virtual machine running Red Hat or Cent OS (1006371)
查看>>
操作xml格式的字符串的方法(C#)
查看>>
[转]MySQL索引详解(1)
查看>>