python多进程与多线程!

有关进程、线程、多进程、多线程

线程与进程

概念

线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位。

进程:是资源分配的基本单位。一个进程包括多个线程。

区别

1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。

2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。

3.不论是大小,开销线程要更“轻量级”

4.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量)

多线程与多进程

多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。

多进程:同时执行多个程序。如,同时运行YY,QQ,以及各种浏览器。

并发与并行

并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

更多的解释

请参考博客园

python开启多线程、多进程

使用threading模块开启多线程

Thread类是threading模块中最重要也是最基本的一个类,它支持使用两种方法来创建线程,一种方法是为构造函数传递一个可调用对象,同时可以传递参数,只不过要求参数必须为元组形式;另一种方法是继承Thread类并在派生类中重写__init__()和run()方法。创建线程对象以后,可以调用其start()方法来启动,该方法自动调用该类对象的run()方法。比如

import threading

def func1(x):

while x:

print(x)

x = x -1

threading.Thread(target=func1,args=(5,)).start()

1

2

3

4

5

6

Thread对象的daemon属性

当某子线程的daemon属性为True时主线程运行结束时不对子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,无论是否运行完成。daemon属性的默认值为False,如需修改,则必须在调用start()方法启动线程之前修改。

使用_thread模块(不推荐)

比如上面的代码可改为

import _thread

import time

def func1(x):

while x:

print(x)

x = x -1

_thread.start_new_thread(func1,(5,))

time.sleep(6)

进群:960410445  即可获取数十套PDF!

这里为了防止主线程结束时子线程还未运行完成,阻塞了主线程6s

python开启多进程

与使用threading模块中的Thread对象创建和启动线程类似,可以通过multiprocessing模块中的Process对象来创建和启动进程。比如

from multiprocessing import Process

import os

def f(name):

print('module name:',__name__)

print('parent process id',os.getppid())

print('this process id',os.getpid())

print('this process name',name)

if __name__ =='__main__':

p=Process(target=f,args=('ins',))

p.start()

如果要考虑建立多个子进程可以使用multiprocessing.Pool类。该类可以创建一个进程池,然后在多个核上执行这些进程。例如:

import multiprocessing

import time

def func(msg):

print(multiprocessing.current_process().name + '-' + msg )

#使进程阻塞3s,不然进程执行太快,一个进程就瞬间完执行所有的任务

#这样的话,上面打印的进程名是同一个,出现伪多进程的错觉

time.sleep(3)

if __name__ == "__main__":

pool = multiprocessing.Pool(processes=4) # 创建4个进程

for i in range(3):

msg = "hello %d" %(i)

pool.apply_async(func, (msg, ))

#当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;

# 但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它

pool.close() # 关闭进程池,表示不能在往进程池中添加进程

pool.join() # 等待进程池中的所有进程执行完毕,必须在close()之后调用

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/84999056