目录
多线程多进程的意义
多进程的使用
方式一(fork): 只能在Unix/Linux/Mac系统下执行,windows不可以
方式二(multiprocessing.Process): 全平台通用
方式三(Pool): 同时创建多个子进程
方式四(subprocess模块):
进程间的通信 --Queue
多线程
简单使用
注意事项
Lock
python其实不存在多个线程同时执行
python多线程对CPU的使用率最多为 百分之(100/cpu的逻辑处理器个数 )
ThreadLocal
进程 vs 线程
计算密集型 vs. IO密集型
计算密集型
IO密集型
异步IO
名词解释
进程:
一个能够独立运行的程序,如qq、lol 这些都就是一个进程。
线程:
将一个进程,可以分为多个线程,让我们能够同时干很多事,qq音乐你可以听歌的同时操作其页面。
多线程的优点就是提高cpu的利用率,举个例子,一个工作你交给一个人干,这就是单进程单线程,一个工作你交给多个人干,这就是单进程多线程。 工作代表进程,把工作分成多份每一份就是线程,人就是cpu,具体有多少个人,就是cpu的逻辑处理器个数。比如我的电脑是一个双内核,四个逻辑处理器的cpu,意思就是说我有两个cpu,但是这个cpu用了超线程技术,可以当做4个cpu用,但是它的工作能力肯定不如真正的4核cpu。 这个在任务管理器性能一栏可以查看。
多进程意思差不多,一个人正干着一些工作,这时候又来个工作,他忙不开了,找了个人帮他干,就相当于多进程。
import os
print('Process (%s) start...' % os.getpid())
pid = os.fork()
if pid == 0:
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))
' 方式二(multiprocessing.Process): 全平台通用代码如下
from multiprocessing import Process
import os
def test_process(name):
print('传入的参数为 : %s' % name)
print('子进程为 : %s,子进程的父线程为 : %s' % (os.getpid(), os.getppid()))
if __name__ == '__main__':
print('主进程为 : %s' % os.getpid())
p = Process(target=test_process, args=('sub_processing',))
print('子进程开始运行')
p.start()
p.join()
print('子进程运行完毕')
'结果如下
C:UsersAdministratorDesktop>python demo02.py
主进程为 : 10688
子进程开始运行
传入的参数为 : sub_processing
子进程为 : 9616,子进程的父线程为 : 10688
子进程运行完毕
代码解释,首先主进程 进入 if 代码块内部,创建了一个子进程,同时给子进程安排了工作,就是执行test_process函数。当p.start()的时候子进程开始工作,同时主进程继续向下执行代码,到达了p.join() ,它发现系统让它先等子进程执行完毕以后再向下执行。最终执行完毕。
注意:我上面的代码在pycharm中执行的时候子进程无法执行函数,不知道为什么。但是我在linux中,以及在cmd中是可以执行的。这里知道原因的朋友麻烦告知一下。
方式三(Pool): 同时创建多个子进程from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
'运行结果:
C:UsersAdministratorDesktop>python demo01.py
Parent process 12372.
Waiting for all subprocesses done...
Run task 0 (12124)...
Run task 1 (4252)...
Run task 2 (2400)...
Run task 3 (304)...
Task 3 runs 0.28 seconds.
Run task 4 (304)...
Task 0 runs 0.50 seconds.
Task 1 runs 0.99 seconds.
Task 2 runs 2.43 seconds.
Task 4 runs 2.53 seconds.
All subprocesses done.
可以看出,进程 0 ~ 3 ,几乎同时被创建并开始执行任务,进程4是在进程3 执行完毕以后才开始执行,因为我们刚开始定义了进程池最大容量为4,也就是说它对最大同时执行的进程数量进行了控制。当进程3执行完毕以后,空出了一个位置,进程4才能执行,如果pool函数没有给参数的话会按照 cpu的逻辑处理器的个数来作为默认值。
方式四(subprocess模块):前三种方式都是创建子线程来执行python代码。
方式四是创建一个子进程去cmd命令行下执行命令,如果是linux系统就是去linux的终端执行命令。
例一:
比如,我想在python中创建一个子线程,让它去cmd下执行命令ipconfig去查看一下ip地址。那么就可以如下方式操作:
相关知识
python学习笔记(十六)文件操作
动手学深度学习笔记(一)
《统计学习方法》第 2 章“感知机”学习笔记
Python机器学习基础教程
Python学习手册
csdn技术笔记重新激活.
“物联网开发实战”学习笔记
【大虾送书第二期】《Python机器学习:基于PyTorch和Scikit
python 手写字识别
浅谈Python数据结构(三)
网址: python学习笔记(二十三) https://m.huajiangbk.com/newsview1054869.html
上一篇: 【多线程】初步了解(2) |
下一篇: SafePoint 与 Stop |