python__系统 : 进程
在类unix操作系统下,可以用 os.fork() 创建一个新的进程,windows系统不可以:
import os ret = os.fork()
print('ret=%d' % ret) if ret == :
print('这是子进程:%d,继承自:%d' % (os.getpid(), os.getppid()))
else:
print('这是父进程:%d' % os.getpid()) >>>ret=0
这是子进程:,继承自:
ret=1537
这是父进程:
在执行了 os.fork() 这一句之后,会有两个进程同时向下执行, 返回的 ret 分别是 0(子进程)的 和 大于0(父进程)的 ,
getpid() 是获取当前进程的pid getppid() 是获取父进程的 pid 所以可以看出子进程 1537继承自1536.
注意父进程的结束并不会导致子进程的停止.
所以,一般,用 multiprocessing 模块来创建一个新的进程,多系统通用:
from multiprocessing import Process
import time
import test2 if __name__ == '__main__': p = Process(target=test2.test)
p.start() while True:
print('----mian----')
time.sleep() >>>----mian----
----test----
----mian----
----test----
target 里面是子进程调用对象的名称. (函数放在这个文件里面执行有bug,所以放在了 test2.py 文件里面,不加if __name__ == '__main__': 这一行也会有bug)
Process语法结构如下:
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示这个进程实例所调用对象;
args:表示调用对象的位置参数元组;
kwargs:表示调用对象的关键字参数字典;
name:为当前进程实例的别名;
group:大多数情况下用不到;
Process类常用方法:
is_alive():判断进程实例是否还在执行;
join([timeout]):是否等待进程实例执行结束,或等待多少秒;
start():启动进程实例(创建子进程);
run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
terminate():不管任务是否完成,立即终止;
Process类常用属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
- pid:当前进程实例的PID值;
还有一种方式创建进程,就是Process子类创建子进程, 因为 p.start() 是调用 p的run() 方法,所以需要重写run方法:
class MyProcess(Process): def run(self):
while True:
print('----1----')
time.sleep() if __name__ == '__main__': p = MyProcess()
p.start() while True:
print('main')
time.sleep() >>>main
--------
main
--------
当然,还有更加简单的方法创建进程.那就是进程池:
if __name__ == '__main__': pool = Pool() #最多三个进程 for i in range():
pool.apply_async(test2.test, (i,)) #添加任务 如果换成 pool.apply() 那么会以堵塞的方式添加任务,一个进程执行完才能添加下一个进程 pool.close() #关闭进程池,不能再添加任务
pool.join() #等待进程池里的任务完成
需要注意的是,进程池并不和Process一样会等待子进程的结束,而是任务完成之后马上结束主进程,所以需要 pool.join() 等待子进程结束.
python__系统 : 进程的更多相关文章
- Linux系统——进程和计划任务管理
进程和计划任务管理 一.进程和程序的关系 进程:在CPU及内存中运行的程序代码:动态执行的代码:每个进程可以创建一个或多个进程 程序:保存在硬盘.光盘等介质中的可执行代码和数据:静态保存的代码 二.基 ...
- python__系统 : 异步实现以及GIL
创建进程的方式中有个 callback ,也就是回调. 看代码: from multiprocessing import Pool import time import os def test(): ...
- python__系统 : 线程
线程之间,全局变量可以共享,但是局部变量依然是不共享的,线程的创建方式: threading.Thread(),还可以定义一个类继承Thread,重写他的run方法,具体和进程的写法一样. 那么,线程 ...
- python__系统 : socket_TCP补充,协程
TCP 三次握手: SYN --> SYN+ACK --> ACK 四次挥手: FIN --> ACK (FIN) --> ACK TCP十种状态: LISTEN ...
- python__系统 : socket_TCP相关
tcp和udp对比起来.还是tcp相对稳定一些,但是因为有三次挥手和四次握手,以及确认包(ack)的存在,可能在速度上会比udp慢. 用python的socket模块可以建立tcp服务端: from ...
- python__系统 : socket_UDP相关
socket.socket() 可以创建一个套接字: from socket import * from threading import Thread udp_socket = None dest_ ...
- python__系统 : 线程池
参考文档: https://www.jianshu.com/p/b9b3d66aa0be 使用 ThreadPoolExecutor 类, as_completed 是迭代器, 如果有任务执行完 ...
- 第六周——分析Linux内核创建一个新进程的过程
"万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...
- 【转】Android系统开篇
版权声明:本站所有博文内容均为原创,转载请务必注明作者与原文链接,且不得篡改原文内容.另外,未经授权文章不得用于任何商业目的. 一.引言 Android系统非常庞大.错综复杂,其底层是采用Linux作 ...
随机推荐
- grep和管道
1.管道命令: 可以连接多个Linux命令 命令1 | 命令2 | 命令3 2.grep 正则表达式 从文件或者字符串中搜索字符串 格式:grep ‘’ file 返回符合规则的行 需求:查询 ...
- 多个ModelForm组合成一个表单
打个比方: 我将用户的基本信息 如用户名密码存在继承了Django auth认证组件中的 AbstractUser 类的模型中,并和第二个存了Details模型中,此模型继承UserInfo模型 继承 ...
- .Net CIL
MachineCode->Assembly->CIL(.Net) or SpecialMachineCode(JVM)->Pogramming code CIL Instructio ...
- Html编码(&#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理
学习并了解到Html编码的知识,源于工作中的产品需求.如果一个URL里面包含Puny Code(不仅仅指中文,还可能是韩文等Unicode里非英文的国家文字,本文以含中文的URL为例),而且这个URL ...
- SuiteCRM-7.7.6 (Ubuntu 16.04)
平台: Ubuntu 类型: 虚拟机镜像 软件包: suitecrm-7.7.6 commercial crm open-source suitecrm 服务优惠价: 按服务商许可协议 云服务器费用: ...
- springboot/springmvc转换器
常用的转换器 String转Date转换器(用于接受日期参数自动转换成Date类型便于后台数据处理) /** * 全局handler前日期统一处理 * @author zhanghang * @dat ...
- SQLServer 2012 Ent 安装失败,另辟蹊径
今天配到SqlServer2012 安装不了问题,总是NetFX3,然后一次挂了,然后VS2010 Shell也是个悲剧. 装了VS2010,可以了吧,总不能在不给力吧.但是有提示VS2010是打上s ...
- JavaScript 面向对象编程(三):非构造函数对象的继承
JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...
- linux下composer+laravel随笔
1.composer中文网:https://www.phpcomposer.com/ laravel中文网:https://d.laravel-china.org/ 2.composer是的作用是 ...
- chromedp下载文件的方法,备忘一下。
sect := `//a[@href="v/443.json"]` wd,_ := os.Getwd() fmt.Println(wd) return chromedp.Tasks ...