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. MySQL Replication 详解MySQL数据库设置主从同步的方法

    MySQL同步的流程大致如下:  1.主服务器(master)将变更事件(更新.删除.表结构改变等等)写入二进制日志(master log). 2.从服务器(slave)的IO线程从主服务器(binl ...

  2. 面试:C++String类实现

    #include <iostream> #include <cstring> using namespace std; class CString { private: cha ...

  3. Lambda 遍历

    遍历列表元素 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  4. Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix

      - Normal Map中的值 -   有没有想过,Normal Map(法线贴图)为什么看上去都是“偏蓝色”的?这是因为,在map中存储的值都是在Tangent Space(切空间)下的.比如, ...

  5. Eclipse和Myeclipse的Properties插件(解决properties文件乱码)

    资源链接:链接:https://pan.baidu.com/s/13M2ovUUXLfOENFoD17MLng 密码:zvo9 插件安装: 解压后得到features.Plugins两个文件将他们放入 ...

  6. JAVA WEB 过滤器(Filter)中向容器 Spring 注入 bean

    如果直接使用 @Autoware 获取 bean 会直接使该 bean 为 null,这是因为这种配置过滤器的方法无法在过滤器中使用 Spring bean,因为 Filter 比 bean 先加载, ...

  7. Android系统版本、Platform版本、SDK版本、gradle修改

    虽然之前分析了gradle,但是在eclipse导入Android studio的时候,各个版本出现的问题还是很模糊,下面对各种版本进行一下说明: 参考资料: https://developer.an ...

  8. HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)

    题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...

  9. django2.1---终端打印orm转义的sql语句

    print(connection.queries)可以打印转义后的sql语句 例子: from django.http import JsonResponse,HttpResponse from .m ...

  10. Java基础——GUI编程(二)

    一.事件监听机制 -- 事件源:awt 或swing包中的那些图形界面组件,即发生事件的组件 -- 事件:Event  用户对组件的一个操作 -- 监听器:Listener  负责处理事件的方法 二. ...