1.进程介绍
进程:正在执⾏的程序
程序:没有执⾏的代码,是⼀个静态的
import multiprocessing
import threading
import time
def demo1():
while True:
print('---1--')
time.sleep(1)
def demo2():
while True:
print('---2--')
time.sleep(1)
def main():
# 多线程
# t1 = threading.Thread(target=demo1)
# t2 = threading.Thread(target=demo2)
# t1.start()
# t2.start()
# 多进程
p1 = multiprocessing.Process(target=demo1)
p2 = multiprocessing.Process(target=demo2)
p1.start()
p2.start()
# 传统方式
# demo1()
# demo2()
if __name__ == '__main__':
main()
2.线程和进程之间的对⽐
进程:能够完成多任务,⼀台电脑上可以同时运⾏多个QQ
线程:能够完成多任务,⼀个QQ中的多个聊天窗⼝
根本区别:进程是操作系统资源分配的基本单位,⽽线程是任务调度和执⾏的基本单位。
3.进程之间的通信
Queue-队列 先进先出
共享全局变量不适⽤于多进程编程
import multiprocessing
from queue import Queue
def download(q):
lst =[11,22,33,44]
for item in lst:
q.put(item)
print('数据下载完成,保存到队列当中....')
def parse_data(q):
data=[]
while True:
q_get_data = q.get()
data.append(q_get_data)
if q.empty():
break
print(data)
def main():
# q = multiprocessing.Queue()
q = Queue()
t1 = multiprocessing.Process(target=download,args=(q,))
t2 = multiprocessing.Process(target=parse_data,args=(q,))
t1.start()
t2.start()
# t1.run()
# t2.run() 不允许
if __name__ == '__main__':
main()
4. 进程池之间的通信
当需要创建的⼦进程数量不多时,可以直接利⽤multiprocessing中的Process 动态⽣成多个进程,但是如果是上百甚⾄上千个⽬标,⼿动的去创建的进程的 ⼯作量巨⼤,此时就可以⽤到multiprocessing模块提供的Pool⽅法。
import multiprocessing
a = 1
def demo1():
global a
a += 1
def demo2():
print(a)
if __name__ == '__main__':
t1 = multiprocessing.Process(target=demo1)
t2 = multiprocessing.Process(target=demo2)
t1.start()
t2.start()