首页 > 分享 > python学习笔记(二十三)

python学习笔记(二十三)

目录

多线程多进程的意义

多进程的使用

方式一(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。 这个在任务管理器性能一栏可以查看。

多进程意思差不多,一个人正干着一些工作,这时候又来个工作,他忙不开了,找了个人帮他干,就相当于多进程。

多进程的使用

方式一(fork):  只能在Unix/Linux/Mac系统下执行,windows不可以

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