python实现多任务解析

多任务

多任务

现实中,有很多事情是同时进行的。比如一个歌手一边唱歌,一边跳舞。唱歌与跳舞是同时进行的,如果将这两件事分开进行就显得很尴尬了...

用python来描述唱歌与跳舞这两件事:

from time import sleep
def sing():
    for i in range(3):
        print("singing...%d" % i)
        sleep(1)

def dance():
    for i in range(3):
        print("dancing...%d" % i)
        sleep(1)

if __name__ == '__main__':
    sing()
    dance()

# singing...0
# singing...1
# singing...2
# dancing...0
# dancing...1
# dancing...2

显然,以上的程序不能满足同时唱歌与跳舞的需求,而是先唱歌,后再尬舞

要实现唱歌与跳舞同时执行,就必须用到多任务

所谓多任务,就是操作系统可以同时运行多个任务。比如一边听音乐,一边码代码,一边开着浏览器...

这些任务看起来是并行在执行。可实际上这些任务是在交替执行的,因为任务的数量远多于CPU的核数,而每核CPU在同一时间只能执行一个任务。由于CPU的执行速度很快,在我们看来就好像所有任务在同时执行一样

进程

对于操作系统而言,多任务就是执行多个进程。

所谓进程,就是指正在运行中的代码。

python的os模块封装了常见的系统调用,可以轻松地用fork()方法创建子进程:

import os
pid = os.fork()
if pid == 0:
    print('我在唱歌')
else:
    print('我在尬舞')

# 我在尬舞
# 我在唱歌

代码执行说明:

  • 程序在执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中
  • 父进程和子进程都会从fork()中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的id号

fork

普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回

一个父进程可以fork出很多子进程,父进程要记下每个子进程的id,而子进程可通过调用getppid()拿到父进程的id

import os
rpid = os.fork()
if rpid < 0:
    print("fork调用失败")
elif rpid == 0:
    print("我是子进程(%s), 我的父进程是(%s)" % (os.getpid(), os.getppid()))

else:
    print("我是父进程(%s), 我的子进程是(%s)" % (os.getpid(), rpid))

print('父子进程都可以执行这里的代码')

# 我是父进程(2291), 我的子进程是(2292)
# 父子进程都可以执行这里的代码
# 我是子进程(2292), 我的父进程是(2291)
# 父子进程都可以执行这里的代码

源码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jack-Cui

Jetson TX1开发笔记(三):开发利器-Nsight Eclipse Edition

PC平台(Host): 虚拟机Ubuntu14.04 嵌入式平台(Target): Jeston TX1 一、NSight简介     Jetpack开...

2635
来自专栏用户画像

4.2.4 文件系统实现

线性列表就是把文件名组织成一个线性表,查找的时候依次与线性表中每个表项进行比较。若把文件名按序排列使用折半查找法 可以降低平均的查找时间,但是建立新文件时会增加...

752
来自专栏三杯水

服务稳定性及应用防攻击方案

日志收集推荐使用Elastic Stack协议栈,可以满足收集海量日志需求,而且便于后续分析、报表、报警操作

1263
来自专栏开发 & 算法杂谈

并行化的动态数据竞争验证和检测方法

之前系列提到的动态数据竞争验证和检测方法是结合了验证和检测两部分。这篇文章主要介绍一下并行化的动态数据竞争验证和检测方法。

2194
来自专栏信安之路

新手指南:Bwapp之XSS –stored

XSS 全称:跨站脚本( Cross Site Scripting ),为了不和层叠样式表( Cascading Style Sheets )的缩写 CSS 混...

1020
来自专栏owent

libatbus的几个藏得很深的bug

在写这篇文章前,我突然想到以前流行了一段时间的服务器面试题:当一个BUG只有几百万分之一的概率会出现,怎么办?这个问题在这个BUG里只是毛毛雨而已,因为这次的B...

773
来自专栏逸鹏说道

【推荐】C#线程篇---你所不知道的线程池(4)

线程的创建和销毁都要耗费大量的时间,有什么更好的办法?用线程池! 太多的线程浪费内存资源,有什么更好的办法?用线程池! 太多线程有损性能,有什么更好的办法?用线...

3538
来自专栏偏前端工程师的驿站

JS魔法堂:精确判断IE的文档模式by特征嗅探

一、前言                                 苦逼的前端攻城狮都深受浏览器兼容之苦,再完成每一项功能前都要左顾右盼,生怕浏览器不支持...

1999
来自专栏FreeBuf

负载恶意软件HawkEye的VB Inject样本分析

恶意软件HawkEye的利用大多都是通过钓鱼邮件分发,利用office直接启动HawkEye主体或者一些经过加密的程序,本文中的VB Inject属于后者,也把...

731
来自专栏HappenLee的技术杂谈

线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12

大多数分布式数据库至少提供了最终一致性,这意味着如果停止对数据库的写操作并等待一段时间,最终所有读请求将返回相同的值。但是,这是一个非常弱的一致性保证,所谓的一...

1262

扫码关注云+社区