进程

服务器中, 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. 【学习笔记】响应式布局的常用解决方案(媒体查询、百分比、rem、和vw/vh)

    原文转载:https://blog.csdn.net/sinat_17775997/article/details/81020417 一.媒体查询 不同物理分辨率的设备,在还原设计稿时,css中设置的 ...

  2. ["1", "2", "3"].map(parseInt)

    为什么["1", "2", "3"].map(parseInt) 为 1,NaN,NaN; parseInt() parseInt() 函数 ...

  3. javajsp,Servlet:Property 'Id' not found

    avax.el.PropertyNotFoundException: Property 'Id' not found on type  org.androidpn.server.model.CarSo ...

  4. 字符串循环右移-c语言

    一个长度为len的字符串,对其循环右移n位 [期望]char str[] = "abcdefg";右移3次后,变成"efgabcd" [思路] 思路1. 如果用 ...

  5. 给Sublime Text3 设置自定义快捷键

    Preferrences -> Key Bindings-User打开用户自定义快捷键文件,添加以下代码,保存. [ { "keys": ["ctrl+shift+ ...

  6. ubuntu服务器切换语言

    如果在安装Ubuntu Server时选择了中文,在系统安装完毕后,默认是中文,在操作时经常会显示乱码,如果需要设置回英文,则修改/etc/default/locale,将 LANG="cn ...

  7. SQLite -语法

    SQLite -语法 SQLite是紧随其后的是独特的组称为语法的规则和指导方针.本教程为您提供了快速启动和SQLite的清单的所有基本SQLite语法. 大小写敏感性 注意重要的一点是,SQLite ...

  8. C++中vector用法

    在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...

  9. CNN完成mnist数据集手写数字识别

    # coding: utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data d ...

  10. Ubuntu14.04环境下Qt5.5以上版本无法输入中文的解决教程

    1.前言 由于Qt5.4之后对之前的Qt5版本不再二进制兼容,所以网上很多简单的旧的办法已经失效了,所以本教程的办法是重新编译fcitx-qt5,生成最新的libfcitxplatforminputc ...