进程创建

进程创建:

第一种:直接创建

第二种;利用类来实现

第一种:直接创建

from multiprocessing import Process
import time
def f(name):
time.sleep(2)
print('hello', name, time.ctime())
if __name__ == '__main__':
li = []
for i in range(13): # 文件内有4个进程,同时并发工作:主进程 + 3个进程
p = Process(target=f, args=('world',)) # 创建进程对象
li.append(p)
p.start()
for i in li:
i.join()
print('end')

第二种;利用类来实现

import time
from multiprocessing import Process
class MyProcess(Process):
# def __init__(self, name): 默认有名字
def __init__(self):
super(MyProcess, self).__init__()
# self.name = name
def run(self):
time.sleep(1)
print('hello', self.name, time.ctime()) # 进程自己有name,所以可以不用设定
if __name__ == '__main__':
li = []
for i in range(3):
# p = MyProcess(str(i))
p = MyProcess() # 进程默认有名字
p.start()
li.append(p)
for i in li:
i.join()
print("end")

父子进程:

父子进程:

from multiprocessing import Process
import os
import time
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid()) def f(name):
info('\033[31;1mfunction f\033[0m')
print('hello', name) if __name__ == '__main__': # Win7下必须添加这个,否则会报错
info('\033[32;1mmain process line\033[0m')
time.sleep(10)
p = Process(target=info, args=('\033[32;1mson process\033[0m',))
p.start()
p.join()

进程通信

进程通信:

1 Pipes

2 Queues

Pipes:实现通信: 将父进程作为参数传递个子进程,子进程通过send发送消息给父进程

from multiprocessing import Process, Pipe
def f(conn):
conn.send([12, 34, 56])
# conn.send([12, 34, 56])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe() # 类似Socket,返回主进程,子进程的通行管道
p = Process(target=f, args=(child_conn, ))
p.start()
p2 = Process(target=f, args=(child_conn, ))
p2.start()
print(parent_conn.recv()) # 主进程接收的信息
print(parent_conn.recv()) # 发送了2个所以接收2个
p.join()

Queues:实现通信: 子进程复制了父进程。父进程将Queue对象pickle序列化后交个子进程反pickle

from multiprocessing import Process, Queue
import time
def f(q, name):
q.put([50, name, 'world'])
print('Func Q:', id(q))
if __name__ == '__main__':
li = []
q = Queue()
q.put([12, 'heh', 'world'])
print('Main Q:', id(q))
for i in range(3): # 文件内有4个进程,同时并发工作:主进程 + 3个进程
p = Process(target=f, args=(q, i)) # 创建进程对象,同时子进程操作父进程的队列
li.append(p)
p.start()
print(q.get()) # 父进程来获取子进程传递的
print(q.get()) # 子进程复制了父进程。父进程将Queue对象pickle序列化后交个子进程反pickle
print(q.get())
print(q.get())
for i in li:
i.join()
print('end')

进程数据共享

Manager

from multiprocessing import Process, Manager

def f(d, l,n):
d[n] = '1'
d['2'] = 2
d[0.25] = None
l.append(n)
# print(l)
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range(5))
p_list = []
for i in range(10):
p = Process(target=f, args=(d, l,i))
p.start()
p_list.append(p)
for res in p_list:
res.join()
print(d)
print(l)

进程池

进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

进程池中有两个方法:

1、 apply

2、 apply_async

from  multiprocessing import Process, Pool
import time
def Foo(i):
time.sleep(2)
return i + 100
def Bar(arg):
print('-->exec done:', arg)
pool = Pool(5)
for i in range(10):
pool.apply_async(func=Foo, args=(i,), callback=Bar)
# pool.apply(func=Foo, args=(i,))
print('end')
pool.close()
pool.join()

【更多参考】http://www.cnblogs.com/yuanchenqi/articles/5745958.html

【更多参考】https://www.cnblogs.com/alex3714/articles/5230609.html

Python学习---进程 1225的更多相关文章

  1. Python学习进程

    1周第1天 主要是变量的学习(11月8日) 1.1 python安装(win和linux下)1.2 ipython安装及使用1.3 变量的定义1.4 变量赋值1.5 运算符(赋值.算术.关系.逻辑)1 ...

  2. Python学习进程(13)文件与IO

        本节介绍基本的IO函数和文件的读写操作.     (1)读取键盘输入: Python用于读取键盘输入的函数有两个:raw_input与input. 1)raw_input函数 从标准输入读取一 ...

  3. Python学习进程(12)模块

        模块让你能够有逻辑地组织你的Python代码段.     (1)python模块: 模块化的好处: 1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂. 2.模块也是Python对象, ...

  4. Python学习进程(3)Python基本数据类型

        本节介绍在Python语法中不同的变量数据类型.     (1)基本数据类型: >>> a=10; >>> b=10.0; >>> c=T ...

  5. Python学习进程(2)Python环境的搭建

        本节主要介绍在windows和Linux平台上如何搭建Python编程环境.     (1)查看Python版本: windows: C:\Users\JMSun>python 'pyt ...

  6. Python学习进程(1)Python简介

        Python是一种结合了"解释性"."编译性"."互动性"和"面向对象"的脚本语言. (1)官方介绍: Pyth ...

  7. Python学习进程(15)常用内置函数

        本节介绍Python的一些常用的内置函数.     (1)cmp(x, y): cmp()函数比较 x 和 y 两个对象,并根据比较结果返回一个整数,如果 x<y,则返回-1:如果x&g ...

  8. Python学习进程(14)异常处理

        本节介绍Python进行异常处理的方式,异常处理机制可以帮助我们调试python程序.     (1)异常的简介:     异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行 ...

  9. Python学习进程(11)日期和时间

        本节介绍Python应用程序处理时间和日期的方式.其中转换日期格式是最常用的功能.     (1)获取时间戳: Python 提供了一个 time 和 calendar 模块可以用于格式化日期 ...

随机推荐

  1. 《JavaScript编程精解》读书笔记

    第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. ...

  2. django notes 三:Template 的查找

    django 中有 2种 Template Loader django.template.loaders.filesystem.Loader django.template.loaders.app_d ...

  3. android LinearLayoutForListView

    由于 scrollview 套 listview 会有很多问题,网上很多人用 LinearLayout 模拟 listview, 也可以设置 adapter. 很多人直接继承 BaseAdapter, ...

  4. Git学习系列之Git和TortoiseGit的区别

    不多说,直接上干货! Git和TortoiseGit的区别: TortoiseGit的安装和使用依赖Git. Git有且只有一个,就是linux最初创建的那个叫做Git的程序.现在的维护者的名字我懒得 ...

  5. 通过反射获取及调用方法(Method)

    1.获取方法使用反射获取某一个类中的方法,步骤:①找到获取方法所在类的字节码对象②找到需要被获取的方法 Class类中常用方法: public Method[] getMethods():获取包括自身 ...

  6. WPF事件中的sender就是事件源

    可以看到wpf中所有的事件都是这个格式: private void btnTest_Click(object sender, RoutedEventArgs e)  { Button btn = (B ...

  7. Java EE环境

    Java EE环境,包括EJB容器和Web容器. (1)Web容器:只运行Web应用的容器,例如Tomcat就是开源的Web容器,它可以运行JSP.Servlet等. (2)EJB容器:运行在EJB组 ...

  8. PHP读取配置文件连接MySQL数据库

    读取配置文件方法parse_ini_file($filepath [,$section]) 代码: conn.php <?php //连接数据库 //$conn =new mysqli('loc ...

  9. C#实现Javascript的Splice方法

    最近开始学习Javascript语言,看到splice方法,以下引用其说明:该方法是一个通用删除和插入元素的方法,它可以在数组指定的位置开始删除或插入元素.其包括3个参数:第一个参数指定插入的起始位置 ...

  10. mac安装rz,sz文件操作指令包

    安装需要具备什么样的环境? 1.安装item2 iterm2是一个与terminal一样的指令窗口 item2 下载地址,​​http://iterm2.com/downloads.html,下载后解 ...