【进程线程】multiprocess和threading模块

概念理解

  • 任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
  • 一个进程可以包括多个线程。
  • 一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
  • 一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
  • “互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
  • “信号量”(Semaphore),用来保证多个线程不会互相冲突。mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用semaphore替代mutex。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
    进程与线程的一个简单解释

multiprocessing模块基本使用

  • Process类
from multiprocessing import Process

# Process(target=?,args=?)
# target: 一般指向函数
# args: 向指向函数传递的参数
def task1(i):
	print(str(2**i))

if __name__ == '__main__':
    p1 = Process(target=task1, args=(10,))
    p2 = Process(target=task1, args=(12,))
    p1.start()
    p2.start()

join()方法是为了让母进程阻塞

  • Pool类
    multiprocessing.Pool类可以提供指定数量的进程供用户使用。如果Pool的实例中进程还没有满,有新的进程申请时,就会新建,如果满了,就会先等待,有进程结束后才会新建。
from multiprocessing import Pool

def task1(i):
	print(str(2**i))

if __name__ == '__main__':
	p = Pool(5)
	for i in range(5):
		p.apply_async(target=task1,args=(i,))
	p.close()
	p.join()

调用join()之前必须先调用close()terminate()方法,让其不再接受新的进程申请。

  • 两个进程通过Queue()进行通信。多个进程进行数据交换需要使用Manager()方法提供的Queue()

threading模块基本使用

  • Thread类
    与multiprocessing模块的Process类基本使用类似。
import threading

def task1(i):
	print(str(2**i))

if __name__ == '__main__':
	t_list = []
	for i in range(5):
		t = threading.Thread(target=task1,args=(i,))
		t_list.append(t)
	
	for t in t_list:
		t.start()
	
	for t in t_list:
		t.join()	
  • setDaemon()方法
    通过调用Thread类实例的setDaemon(True)方法,可以使主线程结束时,不再执行子线程。

你可能感兴趣的:(大橙子学Python,python,开发语言)