python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://www.cnblogs.com/sfencs-hcy/p/9721362.html

multiprocessing模块

1.进程的创建

import multiprocessing

def func(msg):
print(msg)
print("这是一个进程")
if __name__=="__main__":
p=multiprocessing.Process(target=func,args=("hello world",))
p.start()

以继承类的方式创建进程

import multiprocessing
class Myprocessing(multiprocessing.Process):
def __init__(self,name,age):
multiprocessing.Process.__init__(self)
self.name=name
self.age=age def run(self):
#这里是将threading.Thread中的run方法进行了重载
print("%s is %d"%(self.name,self.age))
if __name__=="__main__":
t=Myprocessing("sfencs",19)
t.start()

2.进程的并行

import multiprocessing
import time
class Myprocessing(multiprocessing.Process):
def __init__(self,name,age,second):
multiprocessing.Process.__init__(self)
self.name=name
self.second=second
self.age=age def run(self):
print(self.name)
time.sleep(self.second)
print(self.age) if __name__=="__main__":
time_begin=time.time() p1=Myprocessing("sfencs",19,2)
p2=Myprocessing("Tom",25,5)
p1.start()
p2.start()
p1.join()
p2.join()
time_end=time.time()
print(time_end-time_begin)
'''
Tom
19
25
5.198107481002808
'''

join的用法和线程相同

3.守护进程

守护进程与守护线程的原理相同,只不过设置守护进程的方式为p.daemon=True

4.lock

lock的作用同多线程,实现方式有两种

import multiprocessing

def func2(lock,f):
with lock:
fs=open(f,'a+') fs.write('Lockd acquired via with\n') fs.close()
def func1(lock,f):
lock.acquire()
fs=open(f,'a+')
fs.write('Lock acquired directly\n')
fs.close() lock.release()
if __name__=="__main__":
lock=multiprocessing.Lock()
f = "file.txt"
p1=multiprocessing.Process(target=func2,args=(lock,f,))
p2=multiprocessing.Process(target=func1,args=(lock,f,))
p1.start()
p2.start()
p1.join()
p2.join()

与线程不同的是,这里lock是以参数方式传递,因为不同的进程并不能共享资源

5.Semaphore

用来控制对共享资源的最大访问数量

import multiprocessing
import time def func(s, i):
s.acquire()
print(multiprocessing.current_process().name + "acquire");
time.sleep(2)
print(multiprocessing.current_process().name + "release\n");
s.release() if __name__ == "__main__":
s = multiprocessing.Semaphore(2)
for i in range(5):
p = multiprocessing.Process(target = func, args=(s, 2))
p.start()

6.event与线程用法相同

7.队列

有一个专门属于多进程的队列multiprocessing.Queue

import multiprocessing

def writer(q):
q.put("hello world") def reader(q):
print(q.get()) if __name__ == "__main__":
q = multiprocessing.Queue()
pwriter=multiprocessing.Process(target=writer,args=(q,))
preader = multiprocessing.Process(target=reader, args=(q,))
pwriter.start()
preader.start()

8.管道pipe

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。

import multiprocessing

def sender(p):
p.send("hello world") def receiver(p):
print(p.recv()) if __name__ == "__main__":
p = multiprocessing.Pipe()
psender=multiprocessing.Process(target=sender,args=(p[0],))
preceiver = multiprocessing.Process(target=receiver, args=(p[1],))
psender.start()
preceiver.start()

9.manager

manager实现进程之间数据共享

import multiprocessing

def func(list1,d,i):
list1[i]=i
d["a"]=i if __name__ == "__main__":
with multiprocessing.Manager() as manager:
list1=manager.list(range(5,10))
d=manager.dict()
plist=[]
for i in range(5):
p=multiprocessing.Process(target=func,args=(list1,d,i))
plist.append(p)
p.start()
for i in plist:
i.join()
print(list1)
print(d)

未完

python基础学习21----进程的更多相关文章

  1. Python学习--21天Python基础学习之旅(Day01、Day02)

    21天的python基础学习,使用<Python从入门到实践>,并且需要手敲书中的code,以下为整个学习过程的记录. Day01: 安装python时要选择复选框 Add Python ...

  2. Day1 Python基础学习

    一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编写程序,本质仍然是直接操作 ...

  3. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  4. Day1 Python基础学习——概述、基本数据类型、流程控制

    一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...

  5. Python 基础学习 总结篇

    Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...

  6. (一)python基础学习

    根据廖雪峰老师的python教程写一些学习总结! Python基础学习 1.使用list和tuple (1)list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时 ...

  7. python基础学习(起步)

    目录 python基础学习(起步) 变量 常量 变量的内存管理 python垃圾回收机制 变量的其他赋值方式 今日编程小题 本人能力有限,若有偏颇之处请读者大大不吝赐教! 祝大家每天都在成长! pyt ...

  8. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  9. Python基础学习一

    Python基础学习一 1.变量与常量 变量名:大小写英文.数字.下划线的组合,数字不能开头 常量名:习惯上常量用大写字母命名,例如"PI" 2.多行输出 转义符:反斜杠(),如果 ...

  10. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

随机推荐

  1. visual studio code 个人设置

    { "vim.disableAnnoyingNeovimMessage": true, "php.validate.executablePath": " ...

  2. Eclipse juno 中安装 JBoss Tools,集成Hibernate

    在Eclipse中集成Hibernate工具可以帮助开发者根据数据库生成映射文件.注释代码以及反向工程. Hibernate Tools作为JBoss Tools的核心组件,已经被捆绑在JBoss T ...

  3. 深度理解C# 的执行原理

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 从编译原理说起 虚拟机是什么 C# 是什么,IL 又是什么 .Net Framework vs Mono ...

  4. console 调试技巧

    前言 如果统计一番前端最常用的方法,那么 console.log 一定位列其中.无论你写的是原生 JS 亦或者是 JQuery.Vue等等,调试之时,都离不开 console.log 方法.但是,co ...

  5. Spring Security基本配置

    Spring Security 是一个功能强大且可高度自定义的身份验证和访问控制框架. 它是保护基于Spring的应用程序的事实上的标准.Spring Security 是一个专注于为Java应用程序 ...

  6. [日常] Go语言圣经--复数,布尔值,字符串习题

    go语言圣经-复数 1.我们把形如a+bi(a,b均为实数)的数称为复数,其中a称为实部,b称为虚部,i称为虚数单位.两种精度的复数类型:complex64和complex128,分别对应float3 ...

  7. 胡同门牌号-2015决赛Java语言A组第一题

    标题:胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的.有一天小明突然发现了有趣的事情:如果除去小明家不算,胡同里的其它门牌号加起来,刚好是 ...

  8. Killing Monsters(hdu4970)

    Killing Monsters Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...

  9. Hanoi问题 算法

    问题描述:假设有3个分别命名为A.B.C的塔座,在塔座A上插有n个直径大小各不同,一小到大标号为1,2,….,n的圆盘,要求将塔座A上的n个圆盘移动到C盘上,并且仍按原来的顺序叠排. 同时遵循下列规则 ...

  10. 微信小程序点击图片放大预览

    微信小程序点击图片放大预览使用到 wx.previewImage 接口,可以放大.上/下一张 上代码 wxml代码 <view class='content-img' wx:if="{ ...