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

 更新时间:2014年07月03日 10:23:49   投稿:hebedich   我要评论
今天看到别人的源代码中有 fork 子进程来操作数据。但是由于 fork 之后,没有及时的退出,导致系统中的Python进程越来越多,子进程越来越多了。

自己随手写了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 的枚举 Enum

    浅谈Python 的枚举 Enum

    下面小编就为大家带来一篇浅谈Python 的枚举 Enum。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • django解决跨域请求的问题详解

    django解决跨域请求的问题详解

    这篇文章主要介绍了django解决跨域请求的问题详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用pandas对两个dataframe进行join的实例

    使用pandas对两个dataframe进行join的实例

    今天小编就为大家分享一篇使用pandas对两个dataframe进行join的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 解决phantomjs截图失败,phantom.exit位置的问题

    解决phantomjs截图失败,phantom.exit位置的问题

    今天小编就为大家分享一篇解决phantomjs截图失败,phantom.exit位置的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Python3.6实现连接mysql或mariadb的方法分析

    Python3.6实现连接mysql或mariadb的方法分析

    这篇文章主要介绍了Python3.6实现连接mysql或mariadb的方法,结合实例形式分析了Python3.6针对mysql或mariadb金沙国际官网操作的相关模块安装、金沙国际官网与表的创建、金沙国际官网连接等操作技巧与注意事项,需要的朋友可以参考下
    2018-05-05
  • 实例讲解python中的协程

    实例讲解python中的协程

    在本篇文章里我们给大家通过实例讲述一下关于python中的协程相关知识点内容,需要的朋友们可以参考下。
    2018-10-10
  • python实现朴素贝叶斯分类器

    python实现朴素贝叶斯分类器

    这篇文章主要为大家详细介绍了python实现朴素贝叶斯分类器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 对Python2与Python3中__bool__方法的差异详解

    对Python2与Python3中__bool__方法的差异详解

    今天小编就为大家分享一篇对Python2与Python3中__bool__方法的差异详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python编程实现希尔排序

    python编程实现希尔排序

    这篇文章主要介绍了python实现希尔排序,已编程实现的希尔排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Python 基础之字符串string详解及实例

    Python 基础之字符串string详解及实例

    这篇文章主要介绍了Python 字符串(string) 的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论