多任务理解

单核cpu完成多个cpu的切换

时间片轮转

优先级调度

并发看上去一起执行

并行一起执行

调度算法

什么样的情况下用什么样的规则让谁去执行.

一般情况下电脑都是并发的

进程的创建-fork

进程VS程序

编写完毕的代码,在没有运行的时候,称为程序

正在运行的代码,称为进程

进程,除了包含代码以外,还有需要运行的环境,所以和程序是有区别的

fork()

fork创建一个进程,ret大于0是父进程,不确定返回几,ret等于0是子进程

在linux系统下(centos)才能执行,windows提示没有fork方法

  1. import os
  2. import time
  3. ret = os.fork()
  4. if ret == 0:
  5. while True:
  6. print('--1--')
  7. time.sleep(1)
  8. else:
  9. while True:
  10. print('--2--')
  11. time.sleep(1)

一般操作系统能运行65535个进程,pid就像人的身份证,不可能相同

getpid获取当前进程的值

getppid获取当前进程父进程的值

父进程中fork的返回值,就是刚刚创建的子进程的ID

fork产生一个子进程,几乎同时打印父进程子进程1,然后父进程睡三秒,打印over,子进程1在父进程睡三秒的同时睡五秒,所以过了两秒后打印子进程2,然后打印over

  1. import os
  2. import time
  3.  
  4. ret =os.fork()
  5.  
  6. if ret==0:
  7. print('---子进程1---')
  8. time.sleep(5)
  9. print('---子进程2---')
  10. else:
  11. print('---父进程---')
  12. time.sleep(3)
  13.  
  14. print('---over---')

全局变量在多个进程数据不共享

进程和进程之间数据不会共享

  1. import os
  2. import time
  3.  
  4. g_num=100
  5.  
  6. ret = os.fork()
  7. if ret == 0:
  8. print('---process-1---')
  9. g_num+=1
  10. print('---process-1 g_num=%d---'%g_num)
  11. else:
  12. time.sleep(1)
  13. print('---process-2---')
  14. print('---process-2 g_num=%d---'%g_num)

网络的目的在于进程间的通信

多次fork

共四个进程

  1. import os
  2. import time
  3.  
  4. ret = os.fork()
  5. if ret == 0:
      #子进程
  6. print('---1---')
  7. else:
      #父进程
  8. print('---2---')
  9. #父子进程
  10. ret = os.fork()#到这一步时,上面父进程和fork出来的子进程又都分别fork了一份进程
  11. if ret ==0:
      #父进程的第二个子进程
      #子进程的儿子
  12. print('---11---')
  13. else:
      #父进程
      #子进程
  14. print('---22---')

上段代码的变形,共有三个进程

  1. import os
  2. import time
  3.  
  4. ret = os.fork()
  5. if ret == 0:
      #子进程
  6. print('---1---')
  7. else:
      #父进程
  8. print('---2---')
  9.  
  10. ret = os.fork()
  11. if ret ==0:
         #父进程的第二个子进程
  12. print('---11---')
  13. else:
         #父进程
  14. print('---22---')

如果在某个进程下fork,那么就只能多一个进程,如果在父子进程都能执行的地方fork,它们就会各生一个儿子,就多了两个进程了

几个fork就能创建2的几次方个进程

  1. import os
  2. #fork炸弹,贼吊,不信试试
  3. while True:
  4. os.fork()

fork不能跨平台,我们用multiprocessing模块,它能跨平台

  1. from multiprocessing import Process
  2. import time
  3.  
  4. def test():
  5. while True:
  6. print('---test---')
  7. time.sleep(1)
  8.  
  9. p = Process(target=test)
  10. p.start() # 让这个子进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了
  11.  
  12. #主进程
  13. while True:
  14. print('---main---')
  15. time.sleep(1)

对上面的代码做了一些改进,只有等到子进程执行完,主进程才会结束

  1. from multiprocessing import Process
  2. import time
  3.  
  4. def test():
  5. for i in range(5):
  6. print('---test---')
  7. time.sleep(1)
  8.  
  9. p = Process(target=test)
  10. p.start() # 让这个进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了

join

  1. from multiprocessing import Process
  2. import time
  3. import random
  4.  
  5. def test():
  6. for i in range(random.randint(1,5)):
  7. print('---%d---'%i)
  8. time.sleep(1)
  9.  
  10. p = Process(target=test)
  11. p.start() # 让这个进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了
  12. p.join(2)#阻塞,等多少秒
  13. print('---main---')

process子类

创建新的进程还能够使用类的方式,可以自定义一个类,继承process类,每次实例化这个类的时候,就等于实例化这个进程对象

进程池,缓冲数据用

没有因为进程数少于任务数而阻塞,创建进程池是3表示最多3个同时干活,不用销毁进程节省了时间

  1. from multiprocessing import Pool
  2. import os
  3. import time
  4.  
  5. def worker(num):
  6. for i in range(5):
  7. print('---pid=%d---num=%d' % (os.getpid(), num))
  8. time.sleep(1)
  9.  
  10. #3表示进程池中最多有3个进程一起执行
  11. pool = Pool(3)
  12. for i in range(10):
  13. print('---%d---' % i)
  14. #向进程池中添加任务
  15. #注意:如果添加的任务数量超过了进程池中进程的个数的话,那么不会导致添加不进去
  16. # 添加到进程池中的任务,如果还没有被执行的话,那么此时,它们会等待进程池中的进程完成一个任务之后,
  17. # 会自动去掉用刚刚的那个进程,完成当前的新任务
  18. pool.apply_async(worker, (i,))
  19.  
  20. pool.close()#关闭进程池,相当于不能再添加新任务了
  21. pool.join()#主进程创建/添加任务后,主进程默认不会等待进程池中的任务执行完后才结束,
  22. # 而是当主进程的任务做完之后,立马结束,如果这个地方没有join,会导致进程池中的任务不会执行

fork和multiprocessing的更多相关文章

  1. 多任务fork、multiprocessing、进程池、进程间通信-Queue

    并发:一个处理器同时处理多个任务. 并行:多个处理器或者是多核的处理器同时处理多个不同的任务. fork创建子进程 import os import time #fork出一个子进程,子进程也从这一行 ...

  2. Python中的多进程:fork和multiprocessing

    Python的多进程 套路1:os.fork() 先敲段代码: #!/usr/bin/env python3 import os os.fork() print('1111111111') 执行结果: ...

  3. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  4. python 3 并发编程之多进程 multiprocessing模块

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  5. multiprocessing.Pool报pickling error

    multiprocessing.Pool报pickling error 现象 multiprocessing.Pool传递一个普通方法(不在class中定义的)时, 能正常工作. from multi ...

  6. Appium - multiprocessing.pool.MaybeEncodingError-【 “Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘】

    公司同事学习自动化新装环境后,run多进程测试用例时出错: multiprocessing.pool.MaybeEncodingError: Error sending result: ’<ap ...

  7. 多进程之multiprocessing模块、守护进程、互斥锁

    目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...

  8. 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;

    multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...

  9. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

随机推荐

  1. 微软ASP.NET网站部署指南(8):部署Code-Only更新

    1.  综述 初始化部署以后,你须要继续维护和更新你的网站.本章节将向你展示一个不包含数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:假设依据本章节所做的操作出现错误信息 ...

  2. ubuntu被delete的文件位置

    在-/.local/share/Trash/files下边 可以通过 cd / find -name <filename> 找到盖文件的位置

  3. sublime text 2自定义代码片段

    本文引用   http://www.blogjava.net/Hafeyang/archive/2012/08/17/how_to_create_code_snippet_in_subline_tex ...

  4. Oracel 数据库面试题

    1.取出表中第31到40行的记录mysql方案: , oracle方案: select t2.* ) t2 2.truncate和delete有什么区别TRUNCATE TABLE在功能上与不带WHE ...

  5. Spring RestTemplate post

    MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); map.add("auditPara ...

  6. numpy生成随机数

    如果你想说,我不想知道里面的逻辑和实现方法,只想要python生成随机数的代码,请移步本文末尾,最简单的demo帮你快速获取实现方法. 先开始背景故事说明: 在数据分析中,数据的获取是第一步,nump ...

  7. ubuntu安装mysql-python

    1.首先你要确定ubuntu更新源能用.以下的源适合13.X和14.X,低版本号的ubuntu没试过.毕竟劳资不是測试人员. 为了安全起见 cp /etc/apt/source.list /etc/a ...

  8. 【iOS开发】 AudioSession设置, 切换扬声器和听筒详解-保留其他应用音乐(备忘)

    本文转载至 http://blog.sina.com.cn/s/blog_693de6100101f1g8.html (2013-04-10 17:25:24) 转载▼ 标签: audiosessio ...

  9. SignalR 循序渐进(四) Hub的生命周期以及IoC

    有阵子没更新这个系列了,最近太忙了.本篇带来的是Hub的生命周期以及IoC. 首先,Hub的生命周期,我们用一个Demo来看看: public class TestHub : Hub { public ...

  10. java generic super, extend

    //Apple Orange 都继承自Fruit类,同时Jonathan是Apple的子类    List<? extends Fruit> list = new ArrayList< ...