参考链接: 【莫烦Python】Multiprocessing 让你的多核计算机发挥真正潜力 Python 参考链接: 莫烦多进程学习网站 参考链接: multiprocessing — 基于进程的并行 参考链接: multiprocessing.Value(typecode_or_type, *args, lock=True) 参考链接: class multiprocessing.Lock
test05_1.py
# 第6集共享内存和第7集锁
import multiprocessing as mp
import multiprocessing
import time
def job(v, num):
for _ in range(9):
time.sleep(0.1)
v.value += num
print(v.value)
def multicore():
# 返回一个从共享内存上创建的 ctypes 对象。
# 默认情况下返回的实际上是经过了同步包装器包装过的。
# 可以通过 Value 的 value 属性访问这个对象本身。
v = mp.Value('i',0)
p1 = mp.Process(target=job, args=(v,3))
p2 = mp.Process(target=job,args=(v,100))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
start = time.time()
multicore()
end = time.time()
print('程序运行时间:',end-start)
# 程序运行时间: 1.0667119026184082
控制台下输出结果展示(由于多个进程多资源的抢占,导致输出结果的不确定性和读写数据的非一致性):
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 938 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55086' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
103
106
209
309
312
412
415
515
518
618
621
721
724
824
程序运行时间: 1.0735499858856201
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程'; & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55093' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
927
程序运行时间: 1.0723941326141357
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程'; & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55098' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
100
103
203
206
306
309
409
412
512
515
615
618
718
721
821
927
程序运行时间: 1.0703470706939697
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程'; & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55102' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.075882911682129
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> c:; cd 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程'; & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55106' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_1.py'
3
3
103
106
206
209
309
312
315
315
415
418
518
521
621
624
724
727
程序运行时间: 1.072216510772705
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
test05_2.py (大颗粒度使用锁)
# 第6集共享内存和第7集锁
import multiprocessing as mp
import multiprocessing
import time
def job(lk, v, num):
lk.acquire() # 可以阻塞或非阻塞地获得锁。
for _ in range(9):
time.sleep(0.1)
v.value += num
print(v.value)
lk.release() # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。
def multicore():
# 返回一个从共享内存上创建的 ctypes 对象。
# 默认情况下返回的实际上是经过了同步包装器包装过的。
# 可以通过 Value 的 value 属性访问这个对象本身。
v = mp.Value('i',0)
# 原始锁(非递归锁)对象,类似于 threading.Lock 。
# 一旦一个进程或者线程拿到了锁,
# 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
# 任何进程或线程都可以释放锁。
lock = mp.Lock() # 定义一个进程锁
p1 = mp.Process(target=job, args=(lock, v, 3))
p2 = mp.Process(target=job,args=(lock, v, 100))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
start = time.time()
multicore()
end = time.time()
print('程序运行时间:',end-start)
# 程序运行时间: 1.981912612915039
控制台下输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 871 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55127' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_2.py'
3
6
9
12
15
18
21
24
27
127
227
327
427
527
627
727
827
927
程序运行时间: 1.9821550846099854
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
test05_3.py (小颗粒度使用锁)
# 第6集共享内存和第7集锁
import multiprocessing as mp
import multiprocessing
import time
def job(lk, v, num):
for _ in range(9):
time.sleep(0.1)
lk.acquire() # 可以阻塞或非阻塞地获得锁。
v.value += num
print(v.value)
lk.release() # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。
def multicore():
# 返回一个从共享内存上创建的 ctypes 对象。
# 默认情况下返回的实际上是经过了同步包装器包装过的。
# 可以通过 Value 的 value 属性访问这个对象本身。
v = mp.Value('i',0)
# 原始锁(非递归锁)对象,类似于 threading.Lock 。
# 一旦一个进程或者线程拿到了锁,
# 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
# 任何进程或线程都可以释放锁。
lock = mp.Lock() # 定义一个进程锁
p1 = mp.Process(target=job, args=(lock, v, 3))
p2 = mp.Process(target=job,args=(lock, v, 100))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
start = time.time()
multicore()
end = time.time()
print('程序运行时间:',end-start)
# 程序运行时间: 1.0680267810821533
控制台下输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 874 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55139' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_3.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.0803272724151611
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>
test05_4.py (较小颗粒度使用锁)
# 第6集共享内存和第7集锁
import multiprocessing as mp
import multiprocessing
import time
def job(lk, v, num):
for _ in range(9):
lk.acquire() # 可以阻塞或非阻塞地获得锁。
time.sleep(0.1)
v.value += num
print(v.value)
lk.release() # 释放锁,可以在任何进程、线程使用,并不限于锁的拥有者。
def multicore():
# 返回一个从共享内存上创建的 ctypes 对象。
# 默认情况下返回的实际上是经过了同步包装器包装过的。
# 可以通过 Value 的 value 属性访问这个对象本身。
v = mp.Value('i',0)
# 原始锁(非递归锁)对象,类似于 threading.Lock 。
# 一旦一个进程或者线程拿到了锁,
# 后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。
# 任何进程或线程都可以释放锁。
lock = mp.Lock() # 定义一个进程锁
p1 = mp.Process(target=job, args=(lock, v, 3))
p2 = mp.Process(target=job,args=(lock, v, 100))
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
start = time.time()
multicore()
end = time.time()
print('程序运行时间:',end-start)
# 程序运行时间: 1.9647340774536133
控制台下输出结果展示:
Windows PowerShell
版权所有 (C) Microsoft Corporation。保留所有权利。
尝试新的跨平台 PowerShell https://aka.ms/pscore6
加载个人及系统配置文件用了 1034 毫秒。
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> & 'D:\Anaconda3\python.exe' 'c:\Users\chenxuqi\.vscode\extensions\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher' '55162' '--' 'c:\Users\chenxuqi\Desktop\News4cxq\测试多进程\test05_4.py'
3
103
106
206
209
309
312
412
415
515
518
618
621
721
724
824
827
927
程序运行时间: 1.9803450107574463
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程> conda activate base
(base) PS C:\Users\chenxuqi\Desktop\News4cxq\测试多进程>