进程

服务器中, 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
# 主进程
#
#
#
#
#
#
#
#
#
#

进程&进程池的更多相关文章

  1. 并发编程(六)--进程/线程池、协程、gevent第三方库

    一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上百个或上千个,手动创建就较为繁琐,这时就可 ...

  2. python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  3. 并发编程(六)——进程/线程池、协程、gevent第三方库

    进程/线程池.协程.gevent第三方库 一.进程/线程池 1.进程池 (1)什么是进程池 如果需要创建的子进程数量不大,可以直接利用multiprocess中的Process来创建.但是当需要创建上 ...

  4. 并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点

    1.死锁 定义; 类似两个人分别被囚禁在两间房子里,A手上拿着的是B囚禁房间的钥匙,而B拿着A的钥匙,两个人都没法出去,没法给对方开锁,进而造成死锁现象.具体例子代码如下: # -*-coding:u ...

  5. python语法基础-并发编程-进程-进程理论和进程的开启

    ############################################## """ 并发编程的相关概念: 进程 1,运行中的程序,就是进程,程序是没有生 ...

  6. 1.Linux进程--进程标识号

    函数原型 pid_t fork(void); fork的奇异之处在于它被调用一次,却返回两次,它可能有三种不同的返回值: 1.在父进程中.fork返回新创建的子进程的PID 2.在子进程中,fork返 ...

  7. Operating System-Process(1)什么是进程&&进程的创建(Creation)&&进程的终止(Termination)&&进程的状态(State)

    本文阐述操作系统的核心概念之一:进程(Process),主要内容: 什么是进程 进程的创建(Creation) 进程的终止(Termination) 进程的状态(State) 一.什么是进程 1.1 ...

  8. python之进程(池)

    获得进程id import osfrom multiprocessing import Process def info(title): print(title) print('模块名:',__nam ...

  9. (day31) Event+协程+进程/线程池

    目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协 ...

随机推荐

  1. IOS 根据身份证号码获取 年龄 生日 性别

    /** 从身份证上获取年龄 18位身份证 */ -(NSString *)getIdentityCardAge:(NSString *)numberStr { NSDateFormatter *for ...

  2. 微信小程序开发系列五:微信小程序中如何响应用户输入事件

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...

  3. iOS代理模式

    iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...

  4. nodeJS和npm的环境配置

    1.windows下的NodeJS安装是比较方便的(v0.6.0版本之后,支持windows native),只需要登陆官网(http://nodejs.org/),便可以看到首页的“INSTALL” ...

  5. Mathematics-基础:1+2+3+……+n

    设Sn=1+2+3+……+n-1+n则有Sn=n+n-1+……+3+2+1两式相加得2Sn=(n+1)+(n+1)+……+(n+1)2Sn=n×(n+1)Sn=n×(n+1)/2

  6. 公共dao的抽取

    package cn.sxx.dao; import java.util.List; import cn.sxx.model.Dep; import cn.sxx.query.DepQuery; pu ...

  7. linux(Ubuntu/Centos) iproute 路由IP地址等命令集合,查看端口链接

    原 linux(Ubuntu/Centos) iproute 路由IP地址等命令集合,查看端口链接 2017年03月20日 16:55:57 风来了- 阅读数:2291 标签: centoslinux ...

  8. 离散数学-集合的交并差集运算--STL-set类

    代码其实很简单,我们只需要知道set类的使用方法就可以了,比如迭代器的定义( set<T>::iterator it=a.begin() ),和简单的insert函数插入,以及find函数 ...

  9. [LOJ] 分块九题 3

    https://loj.ac/problem/6279 区间修改,区间查询前驱. TLE无数,我觉得这代码最精髓的就是block=1000. 谜一样的1000. 两个启示: 块内可以维护数据结构,比如 ...

  10. db2快速删除大表数据(亲测可用)

    一.推荐.删了不可恢复 TRUNCATE TABLE table_name IMMEDIATE 二. DB2 LOAD FROM d:\DB2_BAK\null.del of del REPLACE ...