小结Python用fork来创建子进程注意事项


Posted in Python onJuly 03, 2014

自己随手写了Python下 fork 进程的测试代码(来说明这个问题不一定完全合适):

def fork(a):
 def now():
  import datetime
  return datetime.datetime.now().strftime("%S.%f")
 import os
 import time
 print now(), a
 if os.fork() == 0:
  print '子进程[%s]:%s' % (now(), os.getpid())
  while 1:
   a-=10
   print '子进程的a值[%s]:%s' % (now(), a)
   if a < 1:
    break
  print '准备退出子进程'
  #os._exit(0) ## 你可以在这里退出子进程
 else:
  print '父进程[%s]:%s' % (now(), os.getpid())
  while 1:
   a-=1
   print '父进程的a值[%s]:%s' % (now(), a)
   if a < 0:
    break
  time.sleep(1)
  print '等待子进程结束...'
  try:
   result = os.wait()
   if result:
    print '子进程:', result[0], result[1]
   else:
    print '没有数据!'
  except:
   print '异常哦...'
  print '父进程...'
 print '最后的值:',a
 #exit(0) ## 你也可以在这里退出,注意,这里是父进程和子进程都共用的地方,在这里退出会导致父进程也一并退出

TIPS:

os.fork() 会有两次返回值,分别是父进程和子进程的返回值
在父进程中,fork返回的值是子进程的PID;
子进程中,这个返回值为0
子进程会复制父进程的上下文
父子进程并不能确定执行顺序
os.fork() 之后,子进程一定要使用 exit() 或者 os._exit() 来退出子进程环境,建议使用 os._exit()
os.fork() 来创建子进程的这个代码并不是很通适,Linux是没问题的,在Windows下就是不能用的,而官方文档也有类似表述:

Note that some platforms including FreeBSD <= 6.3, Cygwin and OS/2 EMX have known issues when using fork() from a thread
Availability: Unix.
Python 相关文章推荐
python获取android设备的GPS信息脚本分享
Mar 06 Python
python获取标准北京时间的方法
Mar 24 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
Python实现对PPT文件进行截图操作的方法
Apr 28 Python
python 写入csv乱码问题解决方法
Oct 23 Python
python中lambda()的用法
Nov 16 Python
使用实现pandas读取csv文件指定的前几行
Apr 20 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
Mac 使用python3的matplot画图不显示的解决
Nov 23 Python
在python3中实现更新界面
Feb 21 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
在Windows8上的搭建Python和Django环境
Jul 03 #Python
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 #Python
盘点提高 Python 代码效率的方法
Jul 03 #Python
python实现html转ubb代码(html2ubb)
Jul 03 #Python
Python 获取新浪微博的最新公共微博实例分享
Jul 03 #Python
python socket 超时设置 errno 10054
Jul 01 #Python
python设置检查点简单实现代码
Jul 01 #Python
You might like
fleaphp rolesNameField bug解决方法
2011/04/23 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
JS的replace方法介绍
2012/10/20 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
小程序云开发实战小结
2018/10/25 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
react 生命周期实例分析
2020/05/18 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
2020/09/11 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[46:25]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第二局
2016/03/05 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
Python判断文本中消息重复次数的方法
2016/04/27 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
python如何停止递归
2020/09/09 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
如何现实servlet的单线程模式
2014/08/05 面试题
白酒市场开发计划书
2014/01/09 职场文书
小学生心理健康活动总结
2015/05/08 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang