2018年5月19日笔记

  • 进程的概念

进程是程序在计算机上的一次执行活动。

进程可分为系统进程和用户进程。

所有正在运行的进程轮流使用CPU,任何一个时间点有且只有一个进程占用CPU。

  • 进程与线程的区别

进程 > 线程

多进程使用CPU的多个核,适合运算密集型

多线程使用CPU的一个核,核心IO密集型

  • python多进程 —— muiltiprocessing模块

python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。Python提供了multiprocessing。

Multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

  • 创建一个Process实例
p1 = multiprocessing.Process(target=func, args=(2,))

target=函数名字

args=函数所需的参数,以tuple形式传入,必须有逗号,注意单个参数的形式

multiprocessing的2个常用方法:

multiprocessing.cpu_count()     # 1. 统计CPU总数

multiprocessing.active_children()       # 2. 获取所有子进程
  • Process实例的常用属性和方法

常用属性:

p1 = multiprocessing.Process(target=func, args=(2,))
p1.name     # 进程名字
p1.pid      # 进程ID

常用方法:

p1 = multiprocessing.Process(target=func, args=(2,))
p1.is_alive()       # 判断进程是否存活
p1.run()            # 启动进程(不常用)
p1.start()          # 启动进程,自动调用run()方法(常用)
p1.join(timeout=5)  # 等待进程结束或直到超时(5s)
  • 习题1
 1 import multiprocessing
 2 import time
 3
 4
 5 def worker(args, interval):
 6     print("start worker {0}".format(args))
 7     time.sleep(interval)
 8     print("end worker {0}".format(args))
 9
10 def main():
11     print("start main")
12     p1 = multiprocessing.Process(target=worker, args=(1, 1))
13     p2 = multiprocessing.Process(target=worker, args=(2, 2))
14     p3 = multiprocessing.Process(target=worker, args=(3, 3))
15     p1.start()
16     p2.start()
17     p3.start()
18     print("end main")
19
20 if __name__ == ‘__main__‘:
21     main()
start main
end main
start worker 1
start worker 2
start worker 3
end worker 1
end worker 2
end worker 3
  • 习题2
 1 import multiprocessing
 2 import time
 3
 4 def worker(args, interval):
 5     print("start worker {0}".format(args))
 6     time.sleep(interval)
 7     print("end worker {0}".format(args))
 8
 9 def main():
10     print("start main")
11     p1 = multiprocessing.Process(target=worker, args=(1, 1))
12     p2 = multiprocessing.Process(target=worker, args=(2, 2))
13     p3 = multiprocessing.Process(target=worker, args=(3, 3))
14     p1.start()
15     p1.join(timeout=0.5)
16     p2.start()
17     p3.start()
18     print("the number of CPU is: {0}".format(multiprocessing.cpu_count()))
19     for p in multiprocessing.active_children():
20        print("The name of active children is: {0}, pid is: {1} is alive".format(p.name, p.pid))
21     print("end main")
22
23 if __name__ == ‘__main__‘:
24     main()
start main
start worker 1
the number of CPU is: 4
The name of active children is: Process-1, pid is: 1348 is alive
The name of active children is: Process-3, pid is: 1350 is alive
The name of active children is: Process-2, pid is: 1349 is alive
end main
start worker 2
start worker 3
end worker 1
end worker 2
end worker 3
  • Lock组件

使用多进程来读写文件时,读和写不能同时进行,为了这种多个进程共享同一资源的场景不出问题,引入了锁机制。

锁有两种状态:被锁(locked)和没有被锁(unlocked)。拥有acquire()和release()两种方法,并且遵循一下的规则:

  • 如果一个锁的状态是unlocked,调用acquire()方法改变它的状态为locked
  • 如果一个锁的状态是locked,acquire()方法将会阻塞,直到另一个线程调用release()方法释放了锁;
  • 如果一个锁的状态是unlocked调用release()会抛出RuntimeError异常;
  • 如果一个锁的状态是locked,调用release()方法改变它的状态为unlocked。
  • 习题3
 1 import multiprocessing
 2 import time
 3
 4 def add1(lock, value, number):
 5     with lock:
 6         print("start add1 number= {0}".format(number))
 7         for i in range(1, 5):
 8             number += value
 9             time.sleep(0.3)
10             print("number = {0}".format(number))
11
12 def add3(lock, value, number):
13     lock.acquire()
14     print("start add3 number= {0}".format(number))
15     try:
16         for i in range(1, 5):
17             number += value
18             time.sleep(0.3)
19             print("number = {0}".format(number))
20     except Exception as e:
21         raise e
22     finally:
23         lock.release()
24         pass
25
26 if __name__ == ‘__main__‘:
27     print("start main")
28     number = 0
29     lock = multiprocessing.Lock()
30     p1 = multiprocessing.Process(target=add1, args=(lock, 1, number))
31     p3 = multiprocessing.Process(target=add3, args=(lock, 3, number))
32     p1.start()
33     p3.start()
34     print("end main")
start main
end main
start add1 number= 0
number = 1
number = 2
number = 3
number = 4
start add3 number= 0
number = 3
number = 6
number = 9
number = 12
  • 多进程间可共享内存

multiprocessing模块提供了共享内存的操作。

一般的变量在进程之间是无法通信的,multiprocessing提供了Value和Array模块,实现了进程间的数据共享。

Python中还提供了强大的Manager模块专门来做数据共享,其支持的类型非常多,包括Value, Array, list, dict, Queue, Lock等。

  • 习题4
 1 import multiprocessing
 2 from multiprocessing import Value, Array, Manager
 3 import time
 4
 5
 6 def add1(value, number):
 7     print("start add1 number= {0}".format(number.value))
 8     for i in range(1, 5):
 9         number.value += value
10         print("number = {0}".format(number.value))
11
12 def add3(value, number):
13     print("start add3 number= {0}".format(number.value))
14     try:
15         for i in range(1, 5):
16             number.value += value
17             print("number = {0}".format(number.value))
18     except Exception as e:
19         raise e
20
21 if __name__ == ‘__main__‘:
22     print("start main")
23     number = Value(‘d‘, 0)
24     p1 = multiprocessing.Process(target=add1, args=(1, number))
25     p3 = multiprocessing.Process(target=add3, args=(3, number))
26     p1.start()
27     p3.start()
28     print("end main")
start main
end main
start add1 number= 0.0
number = 1.0
number = 2.0
number = 3.0
number = 4.0
start add3 number= 4.0
number = 7.0
number = 10.0
number = 13.0
number = 16.0

原文地址:https://www.cnblogs.com/karl-python/p/9065123.html

时间: 2024-11-10 09:04:58

2018年5月19日笔记的相关文章

2018年4月19日笔记

类的概念与声明 类(class):用来描述具有相同属性和方法的对象的集合. 一个类定义了该集合中每个对象所共有的属性和方法. 对象是类的实例(instance). 声明一个类的一般形式如下: class ClassName(object): def funName(self): pass 一个类时,需注意以下几点: 类名首字母大写,类中函数(即方法)名首字母小写 object是所有类的父类(superclass),默认所有类都继承object object不是必填项,但建议要写上object,可

2018年5月8日笔记

CentOS 7上安装mysql # CentOS 7 安装mysql 1. 检测系统是否自带安装 mysql rpm -qa | grep mysql 2. 若已安装,可以进行卸载 rpm -e mysql //普通删除模式 rpm -e --nodeps mysql //强力删除模式,若普通删除时提示存在依赖文件,则进行强力删除 3. 安装mysql # centOS 7 yum install mariadb-server mariadb //在CentOS 7中,由于 MySQL数据库已

2018年4月26日笔记

内置模块:hashlib Python的hashlib提供了常见的摘要算法,如md5,sha1, sha224, sha256, sha384, sha512等等,其中md5最为常用. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示).md5算法得到的就是一个32位的16进制字符串. 一般用法如下:(python3环境中) 1 import hashlib 2 3 # python3 4 m1 = hash

2018年5月3日笔记

常用的正则表达式匹配规则 \d 表示一个数字字符,等价于 [0-9] \D 表示一个非数字字符,等价于 [^\d] \s 表示一个空白字符,等价于 [<空格>\t\r\n\f\v] \S 表示一个非空白字符,等价于 [^\s]\w 表示一个单词字符(数字或字母),等价于 [A-Za-z0-9_]\W 表示一个非单词字符,等价于 [^\w]. 匹配除换行符\n之外的任意一个字符 .* 在一行内,贪婪(尽可能多)匹配任意个字符 .*? 在一行内,非贪婪(尽可能少)匹配任意个字符 (?P<na

2018年5月13日笔记

SQL语句复习 创建一个库 create database DB_name; 授权一个用户 grant all privileges on *.* to 'user1'@'%' identified by 'qwe123'; 创建表 create table table_name(column_name type not null); 查询 select * from tabel_name where condition1 and condition2; 增加 insert into table

10月19日笔记

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>lianxi</title> <style> #bj,.tup{ width: 300px; height: 500px; position: relative; /*relative相对定位 相对于自己原来的位置移动*/ } #xia{ width: 300px; height:10

2018年1月19日 第七次小组会议

今天晚上在电四楼实验室进行了第七次小组会议. 期末考试已经结束,目前已经进入了寒假阶段,但是小组成员目前都在学校,我们计划最近大多数精力投入项目相关内容,并且较为频繁的召开会议,具体安排如下. 完成日历功能的相关功能,具体参考几个日历功能的网页,要求能够显示不同时间的日历区域,将DDL等消息填入对应位置,在已完成的各网页框架中加入获取数据库数据并显示在对应位置的代码,也就是网页主体功能的编写,并且在数据库中增加新的项目,改变数据结构等. 原文地址:https://www.cnblogs.com/

2018年3月19日推荐文章精选,让您一篇内容阅尽好文

数据分析之A股市场技术分析是否可行 作者:youerning简介:这里并不是为了说明技术分析可行,也不是为了说明技术分析不可行,仅是以我浅薄的知识验证一些事情,测试方法及测试结果都会公布如下,至于测试方法是否严谨, 就请读者自行判断吧. 秒杀架构设计 作者:曹林华简介:最近在部门内部分享了原来在电商业务做秒杀活动的整体思路,大家对这次分享反馈还不错,所以我就简单整理了一下,分享给大家参考参考 对某入侵网站的一次快速处理 作者:simeon2005简介:凌晨1点,接到朋友的求助,网站被黑了,访问网

2018年3月19日循环for语句 if语句

if语句: if(表达式){ 代码 }else if(表达式){ 代码 } for循环: for(var i=0; i<10; i++){ alert(1); (弹窗) } while循环: while(表达式){ 代码 } 使用场景 For 次数确定的时候使用 While 直到满足摸个条件的时候终止循环 两个关键字: break    结束循环(终止) continue  跳过本次循环 for(var i=0; i<10; i++){ break :或者 continue } 注意: 1.不