进程

服务器中, 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. HttpURLConnection读取http信息

    废话不多说,直接上code. package mytest; import java.io.BufferedReader; import java.io.IOException; import jav ...

  2. mySQL ODBC 在windows 64位版上的驱动问题

    1,问题的起源 某次编辑一个asp文件,其中访问mysql数据库的连接字符串如下: "driver={mysql odbc 3.51 driver};server=localhost;uid ...

  3. Phalcon初认识

    Phalcon以c扩展交付的全堆栈php开发框架 基本功能 低开销:低内存消耗和CPU相比传统的框架 MVC和HMVC:模块.组件.模型.视图和控制器 依赖注入:依赖注入和位置的服务和它的本身他们的容 ...

  4. SVN与TFS自动同步脚本(很实用)

    一直都在园子里看文章,因为各种原因懒得写文章.最近稍得空闲,把这几天的工作成果分享一下. 因为工作需要,开发人员使用Qt进行系统移动端的开发,Qt的版本控制却不提供连接TFS的设置,只有使用svn.没 ...

  5. C#读取web.config配置文件内容

    1.对配置文件的访问. 方法一: string myConn =System.Configuration.ConfigurationManager.ConnectionStrings["sq ...

  6. toplink

    TopLink,是位居第一的Java对象关系可持续性体系结构,原署WebGain公司的产品,后被Oracle收购,并重新包装为Oracle AS TopLink.TOPLink为在关系数据库表中存储 ...

  7. 什么是Entitlement

    Entitlement(权限),可以想象成App里用于描述该App可以调用哪些服务的字符串.苹果的操作系统(mac os或者iOS)会通过检查这个串,决定这个应用是否可以调用相关功能.比如iCloud ...

  8. Fire Air(华科校赛 网络赛)

    题目 原题链接:https://www.nowcoder.com/acm/contest/106/L 在100000 * 10000的空地上,有n个时间点,每个时间点会在(xi,yi)上种一棵树. 定 ...

  9. Cycloid Hydraulic Motor Use: Use Failure And Treatment

    The cycloidal hydraulic motor is a small low-speed, high-torque hydraulic motor with a shaft-distrib ...

  10. 小程序request请求 POST请求参数传递不到后台

    wx.request({ url: 'https://xxx.com/xxxx.php', data: { 'jscode': code }, method: 'POST', header: { &q ...