fork和multiprocessing
多任务理解
单核cpu完成多个cpu的切换
时间片轮转
优先级调度
并发看上去一起执行
并行一起执行
调度算法
什么样的情况下用什么样的规则让谁去执行.
一般情况下电脑都是并发的
进程的创建-fork
进程VS程序
编写完毕的代码,在没有运行的时候,称为程序
正在运行的代码,称为进程
进程,除了包含代码以外,还有需要运行的环境,所以和程序是有区别的
fork()
fork创建一个进程,ret大于0是父进程,不确定返回几,ret等于0是子进程
在linux系统下(centos)才能执行,windows提示没有fork方法
import os
import time
ret = os.fork()
if ret == 0:
while True:
print('--1--')
time.sleep(1)
else:
while True:
print('--2--')
time.sleep(1)
一般操作系统能运行65535个进程,pid就像人的身份证,不可能相同
getpid获取当前进程的值
getppid获取当前进程父进程的值
父进程中fork的返回值,就是刚刚创建的子进程的ID
fork产生一个子进程,几乎同时打印父进程子进程1,然后父进程睡三秒,打印over,子进程1在父进程睡三秒的同时睡五秒,所以过了两秒后打印子进程2,然后打印over
import os
import time ret =os.fork() if ret==0:
print('---子进程1---')
time.sleep(5)
print('---子进程2---')
else:
print('---父进程---')
time.sleep(3) print('---over---')
全局变量在多个进程数据不共享
进程和进程之间数据不会共享
import os
import time g_num=100 ret = os.fork()
if ret == 0:
print('---process-1---')
g_num+=1
print('---process-1 g_num=%d---'%g_num)
else:
time.sleep(1)
print('---process-2---')
print('---process-2 g_num=%d---'%g_num)
网络的目的在于进程间的通信
多次fork
共四个进程
import os
import time ret = os.fork()
if ret == 0:
#子进程
print('---1---')
else:
#父进程
print('---2---')
#父子进程
ret = os.fork()#到这一步时,上面父进程和fork出来的子进程又都分别fork了一份进程
if ret ==0:
#父进程的第二个子进程
#子进程的儿子
print('---11---')
else:
#父进程
#子进程
print('---22---')
上段代码的变形,共有三个进程
import os
import time ret = os.fork()
if ret == 0:
#子进程
print('---1---')
else:
#父进程
print('---2---') ret = os.fork()
if ret ==0:
#父进程的第二个子进程
print('---11---')
else:
#父进程
print('---22---')
如果在某个进程下fork,那么就只能多一个进程,如果在父子进程都能执行的地方fork,它们就会各生一个儿子,就多了两个进程了
几个fork就能创建2的几次方个进程
import os
#fork炸弹,贼吊,不信试试
while True:
os.fork()
fork不能跨平台,我们用multiprocessing模块,它能跨平台
from multiprocessing import Process
import time def test():
while True:
print('---test---')
time.sleep(1) p = Process(target=test)
p.start() # 让这个子进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了 #主进程
while True:
print('---main---')
time.sleep(1)
对上面的代码做了一些改进,只有等到子进程执行完,主进程才会结束
from multiprocessing import Process
import time def test():
for i in range(5):
print('---test---')
time.sleep(1) p = Process(target=test)
p.start() # 让这个进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了
join
from multiprocessing import Process
import time
import random def test():
for i in range(random.randint(1,5)):
print('---%d---'%i)
time.sleep(1) p = Process(target=test)
p.start() # 让这个进程开始执行test函数里的代码,函数里的代码执行完后,进程也就结束了
p.join(2)#阻塞,等多少秒
print('---main---')
process子类
创建新的进程还能够使用类的方式,可以自定义一个类,继承process类,每次实例化这个类的时候,就等于实例化这个进程对象
进程池,缓冲数据用
没有因为进程数少于任务数而阻塞,创建进程池是3表示最多3个同时干活,不用销毁进程节省了时间
from multiprocessing import Pool
import os
import time def worker(num):
for i in range(5):
print('---pid=%d---num=%d' % (os.getpid(), num))
time.sleep(1) #3表示进程池中最多有3个进程一起执行
pool = Pool(3)
for i in range(10):
print('---%d---' % i)
#向进程池中添加任务
#注意:如果添加的任务数量超过了进程池中进程的个数的话,那么不会导致添加不进去
# 添加到进程池中的任务,如果还没有被执行的话,那么此时,它们会等待进程池中的进程完成一个任务之后,
# 会自动去掉用刚刚的那个进程,完成当前的新任务
pool.apply_async(worker, (i,)) pool.close()#关闭进程池,相当于不能再添加新任务了
pool.join()#主进程创建/添加任务后,主进程默认不会等待进程池中的任务执行完后才结束,
# 而是当主进程的任务做完之后,立马结束,如果这个地方没有join,会导致进程池中的任务不会执行
fork和multiprocessing的更多相关文章
- 多任务fork、multiprocessing、进程池、进程间通信-Queue
并发:一个处理器同时处理多个任务. 并行:多个处理器或者是多核的处理器同时处理多个不同的任务. fork创建子进程 import os import time #fork出一个子进程,子进程也从这一行 ...
- Python中的多进程:fork和multiprocessing
Python的多进程 套路1:os.fork() 先敲段代码: #!/usr/bin/env python3 import os os.fork() print('1111111111') 执行结果: ...
- Python之进程 2 - multiprocessing模块
我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...
- python 3 并发编程之多进程 multiprocessing模块
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- multiprocessing.Pool报pickling error
multiprocessing.Pool报pickling error 现象 multiprocessing.Pool传递一个普通方法(不在class中定义的)时, 能正常工作. from multi ...
- Appium - multiprocessing.pool.MaybeEncodingError-【 “Can’t pickle local object ‘PoolManager.__init__.<locals>.<lambda>‘】
公司同事学习自动化新装环境后,run多进程测试用例时出错: multiprocessing.pool.MaybeEncodingError: Error sending result: ’<ap ...
- 多进程之multiprocessing模块、守护进程、互斥锁
目录 1. multiprocessing 模块介绍 2. Process类的介绍 3. Process类的使用 4. 守护进程 5. 进程同步(锁) 1. multiprocessing 模块介绍 ...
- 多进程 multiprocessing 模块进程并发Process;Pool ;Queue队列 、threading模块;
multiprocessing 模块中的 Process类提供了跨平台的多进程功能,在windows和linux系统都可以使用. 1.首先要实例化一个类,传入要执行的函数. 实例名 = Process ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
随机推荐
- php -- each()、list()
1.each的用法 先看API:array each ( array &$array ) api里是这么描述的:each — 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回 ...
- 自动化测试的组成部分:SEARCH
在考虑自动化测试用例时,不仅仅要考虑测试的执行步骤.在运行任何步骤之前,程序必须处在能够执行测试的状态.在测试执行后,至关重要的是知道测试是否通过,并且测试结果一定要被保存到某处以待检查或进一步分析. ...
- mysql查询各种类型的前N条记录
mysql查询各种类型的前N条记录,将3改为N(需查询条数)即可 (select * from event_info where event_type = 1 limit 3)union all( ...
- 关于Animator状态在运行时的正负方向播放
如果直接在脚本里改播放速度,会报出如下警告: 之前没有很好的解决方法,但根据评论里的新方法,我试了下,可以控制播放正负方向了:
- mac os x 记录 转载
转载:远景网友(手机锋友t5sd3sf):http://bbs.feng.com/read-htm-tid-10434256.html 一个命令制作 OS X 原版安装U盘 1.要保证下载的原版安装包 ...
- 调用PostgreSQL存储过程,找不到函数名的问题
PostgreSQL的表,函数名称都是严格区分大小写的,所以在使用的时候没有注意大小写问题容易导致找不到函数名的错误,但最近两天我们发现,如果函数参数使用了自定义的数据类型,也会发生这个问题. 问题描 ...
- [JAVA]基于微信公众平台开放接口编写的sdk
最近在研究微信公众平台提供的公众服务号,以及提供的开放接口. 写了一个相对来说比较简单的基于java的微信sdk,目前实现的功能没有覆盖所有接口. 有兴趣的话,大家可以在这个基础上进行改进和完善,这样 ...
- 在input文本框中存入对象格式的数据
<input id="teaching" type="hidden" name="teachingProgram" /> JQ: ...
- Tiled地图编辑软件
Tiled官网: http://www.mapeditor.org/ 一个比较简单好用的地图编辑软件.百度可以找到很多教程. 在Egret中,官网提供了Tiled的工具类,但是教程和文档极少...只能 ...
- 微信小程序-云开发(手记)
微信小程序-云开发(手记) 1.创建data.json文件 注意以下几点要求: 入门示例: init方法的env:默认环境配置,传入字符串形式的环境 ID(理解为数据库)可以指定所有服务的默认环境(意 ...