1、进程介绍
进程:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
import multiprocessing
import time
def demo1():
while True:
print('我是进程1....')
time.sleep(1)
def demo2():
while True:
print('我是进程2....')
time.sleep(1)
def main():
t1 = multiprocessing.Process(target=demo1)
t2 = multiprocessing.Process(target=demo2)
t1.start()
t2.start()
if __name__ == '__main__':
main()
2、线程和进程之间的对比
进程:能够完成多任务,一台电脑上可以同时运行多个QQ
线程:能够完成多任务,一个QQ中的多个聊天窗口
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
3、进程之间的通信
Queue-队列 先进先出from multiprocessing import Queue
共享全局变量不适用于多进程编程
import multiprocessing
from queue import Queue
import time
def download(q):
q.put('abc')
q.put('1')
q.put('2')
q.put('3')
def parse_data(q):
time.sleep(2)
q.get()
def main():
q = multiprocessing.Queue()
# q = Queue()
p1 = multiprocessing.Process(target=download,args=(q,))
p2 = multiprocessing.Process(target=parse_data,args=(q,))
p1.start()
time.sleep(2)
p2.start()
if __name__ == '__main__':
main()
import multiprocessing
a = 1
def demo1():
global a
a += 1
def demo2():
print(a)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=demo1)
p2 = multiprocessing.Process(target=demo2)
p1.start()
p2.start()
4、进程池之间的通信
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程,但是如果是上百甚至上千个目标,手动的去创建的进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法
# from multiprocessing import Pool
# import time,os,random
# def worker(msg):
# t_start = time.time()
# print('%s开始执行,进程号为%d' % (msg, os.getpid()))
#
# time.sleep(random.random() * 2)
# t_stop = time.time()
# print(msg, "执行完成,耗时%0.2f" % (t_stop - t_start))
# if __name__ == '__main__':
# po = Pool(4) # 定义一个进程池
# for i in range(0,20):
# po.apply_async(worker, (i,))
#
# print("--start--")
# po.close() # 一旦池子满了 关闭
# po.join()
import multiprocessing
def demo1(q):
q.put(1)
q.put(2)
q.put(3)
def demo2(q):
print(q.get())
print(q.get())
print(q.get())
if __name__ == '__main__':
q = multiprocessing.Manager().Queue()
po = multiprocessing.Pool(2)
po.apply_async(demo1,args=(q,))
po.apply_async(demo2,args=(q,))
po.close()
po.join()