进程&进程池
进程
服务器中, s.listen(n) n不能无限大,以为内存不可能无限大,n表示内存同一时间接纳的等待连接数,可以看成一个(队列),取出一个拿去建立连接,然后再放进一个,队列中一直保持n个连接
请求.
补充一点:
print() 是计算操作, 计算机中除了IO,都是计算(PS:cpu干的活都是计算).
进程的运行回收机制: 主进程等子进程运行完 才回收子进程,自己再关闭
父进程杀死了,子进程就会变成孤儿进程(甚至变成僵尸进程)
非常重要的一个概念:
运行py文件,在进程中显示的不是xx.py, 而是解释器的python.exe,
是因为代码只是一堆符号,没有意义,只有把代码传给python解释器,python解释器解释后,调用的python解释器的功能.
实际上用的python解释器的功能,所以进程中显示运行的是python.exe解释器而不是xx.py文件.
(举个例子:py文件中一行代码为print,那么python解释器就会调用自己的打印功能)
查看进程号:
import os
print(os.getpid()) #打印进程id号
print(os.getppid()) # 父进程id号
查看进程和杀死进程:
cmd解释器中:
tasklist |findstr python #管道符 过滤 查看python关键字 进程
干掉python进程
tskill python tskill 进程name
tskill 进程pid号
运行环境的父进程:
运行一个xxx.py (python3环境下) , 打印这个进程的父进程id号,发现是pycharm 的id号.为什么呢?
pycharm 运行 python3 xxx.py , 然后 产生一个 python.exe 进程.所以pycharm是这个python.exe的父进程
(pycharm 运行 python3 xxx.py ====>> python.exe) PS:如果在cmd中运行,这个python.exe的父进程就是cmd的id号
jion():
jion(),主进程等待子进程
import time
from multiprocessing import Process def task(name):
time.sleep(2)
print('%s' % name) if __name__ == '__main__':
p = Process(target=task,args=('kitty',))
p.start()
p.join() #等 子进程运行完毕,主进程才继续往下运行
print('主进程')
如果有多个子进程:p1 p2 p3
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# 这种情况下,相当于串行(等待上一个进程执行完,才继续往下执行下一个进程)
-
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
# 这种情况下,是并发(PS:join()的顺序先后没关系)
可以简洁点:
p_l = [p1,p2,p3]
for p in p_l:
p.start()
for p in p_l:
p.join()
name = None
进程名可以自定义:
if __name__ == '__main__':
p = Process(target=task,args=('kitty',),name='haha')
p.start()
p.join()
print(p.name) #haha 自定义子进程名字
print('主进程')
terminate(): 杀死进程
is_alive(): 判断进程是否活着
def task(name):
time.sleep(2)
print('%s' % name) if __name__ == '__main__':
p = Process(target=task,args=('kitty',))
p.start()
p.terminate() #杀死进程p
print(p.is_alive()) #True 之所以是True,而不是False,是因为杀死进程p.terminate()只是发了一个信号,主进程马上就判断
# (杀死进程需 要时间)
print('主进程')
注意:
慎用, 如果儿子进程开了个孙子进程,就会产生孤儿进程(比较危险)
现实场景也很少这种操作
进程池
1.进程池中存放的就是进程,只不过加上了数目的限制,
2.进程池造出来后,不会开新的进程,从始至终就是造进程池时定义的数目
3.等进程池中的所有进程都完毕,先关门,在等(shutdown(wait = True))
示例:
import time
from concurrent.futures import ProcessPoolExecutor def task(name):
time.sleep(2)
print('%s' % name) if __name__ == '__main__':
p = ProcessPoolExecutor(4) # 立刻造好4个进程
# p.submit(task,'kitty1')
# p.submit(task,'kitty2')
# p.submit(task,'kitty3')
# p.submit(task,'kitty4')
for i in range(1, 11):
p.submit(task, 'kitty%s' % i) #submit() 往里面丢任务
print('主进程')
提交/调用 任务的方式
1.同步调用:
提交/调用一个任务,然后就在原地等着,等到该任务执行完毕拿到结果,再执行下一行代码
2.异步调用:
提交/调用一个任务,不在原地等着,直接执行下一行代码.
from concurrent.futures import ProcessPoolExecutor
新版本中(新模块中)根本就没有同步接口,只有异步接口,就是submit()
新版本中:
关门+等
shutdown(wait = True)
---------------------------------------------------------------------------------------
from multiprocessing import Process, Pool
老版本中(Pool)中有个同步接口 p.apply()
老版本中:
关门+等
pool.close()
pool.join()
--------------------------------------------------------
同步调用方式:
开进程 等待 再开,再等这种提交任务的方式,想当于串行
for p in p_l:
p.start()
p.join()
示例:
import time
from concurrent.futures import ProcessPoolExecutor def task(name, n):
time.sleep(1)
print('%s' % name)
return n**2 if __name__ == '__main__':
p = ProcessPoolExecutor(4)
p_l = []
for i in range(1, 11):
obj = p.submit(task, 'kitty%s' % i, i)
print(obj.result()) #相当于start和join连用
print('主进程') # kitty1
#
# kitty2
#
# kitty3
#
# kitty4
#
# kitty5
#
# kitty6
#
# kitty7
#
# kitty8
#
# kitty9
#
# kitty10
#
# 主进程
异步调用方式:
for i in range(10):
p.submit(func,'xx')
示例:
import time
from concurrent.futures import ProcessPoolExecutor def task(name, n):
time.sleep(1)
print('%s' % name)
return n**2 if __name__ == '__main__':
p = ProcessPoolExecutor(4)
p_l = []
for i in range(1, 11):
obj = p.submit(task, 'kitty%s' % i, i) # obj是个对象,通过对象拿到结果
p_l.append(obj)
p.shutdown(wait = True) #shutdown(wait = True) 等,但是前提是进程池中不能再放进新的任务了,否则数目不准确(先关门+等)
print('主进程')
for i in p_l:
print(i.result()) # kitty1
# kitty2
# kitty3
# kitty4
# kitty5
# kitty6
# kitty7
# kitty8
# kitty9
# kitty10
# 主进程
#
#
#
#
#
#
#
#
#
#
进程&进程池的更多相关文章
- 并发编程(六)--进程/线程池、协程、gevent第三方库
一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- 并发编程(六)——进程/线程池、协程、gevent第三方库
进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...
- 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点
1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...
- python语法基础-并发编程-进程-进程理论和进程的开启
############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生 ...
- 1.Linux进程--进程标识号
函数原型 pid_t fork(void); fork的奇异之处在于它被调用一次,却返回两次,它可能有三种不同的返回值: 1.在父进程中.fork返回新创建的子进程的PID 2.在子进程中,fork返 ...
- Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)
本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...
- python之进程(池)
获得进程id import osfrom multiprocessing import Process def info(title): print(title) print('模块名:',__nam ...
- (day31) Event+协程+进程/线程池
目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协 ...
随机推荐
- mysql单向自动同步
mysql自动同步 以下教程均使用mysql自带的自动同步功能 全库单向自动同步 本例把192.168.3.45上名称为ewater_main的数据库自动同步到192.168.3.68的ewater_ ...
- Android Studio Terminal 不是内部或外部命令,也不是可运行程序或批处理文件
1.Android Studio Terminal 命令行无效的问题 在Android Studio中自带了命令行终端Terminal,但是我们在输入命令时经常会发现:“XXX”不是内部或外部命令,也 ...
- JSP报错The value for the useBean class attribute *** is invalid.
环境:IDEA+Tomcat9+JDK1.8 在前期学习时,环境一直能够"正常"使用,实际上环境并没有完全搭建成功. 推荐: https://blog.csdn.net/lw_po ...
- react基础语法(四) state学习
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Traceroute侦测主机到目的主机之间所经路由情况的重要工具
ICMP的应用--Traceroute Traceroute是用来侦测主机到目的主机之间所经路由情况的重要工具,也是最便利的工具.前面说到,尽管ping工具也可以进行侦测,但是,因为ip头的限制,pi ...
- CSS 功能简介
CSS的功能主要包括节点管理(Node Management,以下简称NM)和组管理(Group Management,以下简称GM)两部分,都是由守护进程ocssd.bin 来实现的,这是个多线程的 ...
- 解决Homestead yarn , npm run dev, 命令报错问题!
解决Homestead yarn , npm run dev, 命令报错问题! 2018年06月01日 11:50:51 偶尔发发颠 阅读数:1654 版权声明:本文为博主原创,未经博主同意,不 ...
- PYTHON_DAY_02
今日内容: 01 列表内置方法 '''''' ''' 列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开. 一般用于存放学生的爱好,课堂的周期等等... ''' # 定义一个学生列表, ...
- eclipse下svn的分支与合并指南 - 更新版
http://wenku.baidu.com/link?url=ul5vzBHZpHgzENp46RQwTYrkCUYLeVg9TuhmPM_qisR1BGzp6Qca7onhS-SOzwDYuYdA ...
- VS C++项目报错warning C4199: ……use /Zc:twoPhase-
具体的报错如下: c1xx : warning C4199: two-phase name lookup is not supported for C++/CLI, C++/CX, or OpenMP ...