python中进程的几种创建方式
在新创建的子进程中,会把父进程的所有信息复制一份,它们之间的数据互不影响。
使用os.fork()创建
该方式只能用于Unix/Linux操作系统中,在windows不能用。
import os
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
print('子进程')
else:
print('父进程')
使用Process类类创建
multiprocessing模块提供了一个Process类来代表一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
from multiprocessing import Process
import time
def test(name, age):
for i in range(5):
print("--test--%s\t%d" % (name, age))
time.sleep(1)
print("子进程结束")
if __name__ == '__main__':
p = Process(target=test, args=("aaa", 18))
p.start()
# 等待进程实例执⾏结束,或等待多少秒;
p.join() # 等待的最长时间
print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""
join()方法表示主进程等待子进程执行完成后继续往下执行,如果把join()注释掉,则主进程开启子进程后不停顿继续往下执行,然后等待子进程完成程序结束。
把join()方法注释掉的结果:
"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""
使用Process子类创建
创建新的进程还能够使用类的方式,可以自定义一个类,继承Process类,每次实例化这个类的时候,就等同于实例化一个进程对象,请看下面的实例:
from multiprocessing import Process
import time
import os
class MyProcess(Process):
def __init__(self):
# 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
# Process.__init__(self)
super(MyProcess,self).__init__()
# 重写Porcess的run()方法
def run(self):
print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
for i in range(5):
print("--1--")
time.sleep(1)
if __name__ == '__main__':
t_start = time.time()
p = MyProcess()
p.start()
# p.join()
print("main")
for i in range(5):
print("--main--")
time.sleep(1)
使用进程池Pool创建
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例:
from multiprocessing import Pool
import os
import time
def worker(num):
# for i in range(3):
print("----pid=%d num=%d---" % (os.getpid(), num))
time.sleep(1)
if __name__ == '__main__':
# 定义一个进程池,最大进程数3
pool = Pool(3)
for i in range(10):
print("---%d--" % i)
# 使用非阻塞方式调用func(并行执行),一般用这个。
# apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
pool.apply_async(worker, (i,))
# 关闭进程池
pool.close()
# 等待所有子进程结束,主进程一般用来等待
pool.join() # 进程池后面无操作时必须有这句
python中进程的几种创建方式的更多相关文章
- python中字符串的几种表达方式(用什么方式表示字符串)
说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 ...
- python中字符串的四种表达方式
今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 > ...
- java中多线程的两种创建方式
一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继 ...
- Android中Fragment的两种创建方式
fragment是Activity中用户界面的一个行为或者是一部分.你可以在一个单独的Activity上把多个Fragment组合成为一个多区域的UI,并且可以在多个Activity中再使用.你可以认 ...
- python中单例模式的四种实现方式
配置文件settings.py IP='100.0.0.2' PORT=3302 方式一:绑定给类的方法 class Mysql: __instance = None def __init__(sel ...
- python中的字典两种遍历方式
dic = {"k1":"v1", "k2":"v2"} for k in dic: print(dic[K]) for ...
- 【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
- ORM中choices参数(重要)、MTV于MVC模型、多对多关系三种创建方式
choices参数(重要) **使用方式
- Django中提供的6种缓存方式
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
随机推荐
- MySQL_(Java)使用JDBC向数据库发起查询请求
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...
- LNMP源码编译
LNMP源码编译 编译安装之前把开发包组安装了 [root@tiandong63 ~]# yum groupinstall "Development Tools" "De ...
- 关于数据上传阿里云MaxCompute调研
1.背景 当前的数据存储基于mysql库表存储形式,目前已经无法满足愈加增大的数据存储需求,新项目基于Maxcompute数据仓库架构,需要将统计日志上传Maxcompute,本文对Maxcomput ...
- css 元素的竖向百分比设定是相对于容器的高度吗?
结论是,如果是height的话,是相对于容器高度,如果是padding-height,margin-height则是相对于容器的宽度. 举例说明: <!DOCTYPE html> < ...
- C++入门经典-例9.5-为具体类型的参数提供默认值
1:默认模板参数是指类模板中由默认的数据类型作为参数的参数,在模板定义时,还可以为默认的数据类型声明,变量,并为变量赋值.代码如下: // 9.5.cpp : 定义控制台应用程序的入口点. #incl ...
- Nginx 配置443 HTTPS
server { listen 443 ssl; server_name localhost; ssl on; ssl_certificate D://newlingshou//nginx-1.12. ...
- mybatis延迟加载(Collection)
上篇讲了assocation,同样我们也可以在一对多关系配置的结点中配置延迟加载策略. 结点中也有 select 属性,column 属性. 需求: 完成加载用户对象时,查询该用户所拥有的账户信息. ...
- Python中函数的使用
函数让代码的编写,阅读,测试和修改都变得更容易,提高代码的复用性,python中使用def关键字定义函数 如下代码在python3.7.3的Genay开发工具中编写测试通过. 一.简单函数定义及调用 ...
- Linux搭建PHP环境(LAMP)
//安装Apache的命令 # yum install httpd //启动Apache的命令 # service httpd start //安装MySQL的命令 # wget http://dev ...
- RGB颜色透明度转换
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...