3/29课后总结
Process类中得方法
from multiprocessing import Process
import time
def test():
print(11)
time.sleep(5)
if __name__ == '__main__':
p = Process(target=test)
p.start() # 进程开始
# p.join() # 在子线程运行完毕后在运行主线程
p.terminate() # 杀死进程(需要一段时间,不会立马杀死)
time.sleep(0.1)
print(p.is_alive()) # 查看进程是否存活
如何查看进程号pid
from multiprocessing import Process
import os
def test():
print(11)
print('子进程内的子进程pid:',os.getpid())
print('子进程内查看主进程的pid:',os.getppid())
if __name__ == '__main__':
p = Process(target=test)
p.start()
print('在主进程查看子进程的pid:',p.pid) # 放在start前面的话会显示None
print('在主进程查看主进程的pid:',os.getpid())
如何开启多进程
# 每个进程都会有一个进程号
from multiprocessing import Process
import time
def test(i):
print(i)
time.sleep(1)
if __name__ == '__main__':
begin_time = time.time()
l = []
for i in range(10):
"""通知开进程,但是不一定能立马开起来,开进程需要消耗资源"""
p = Process(target=test,args=(i,))
p.start()
# p.join() 如果是这里加join那么就会变成串行执行
l.append(p)
for j in l:
j.join()
print('end')
print(time.time()-begin_time)
基于TCP的高并发程序
from multiprocessing import Process,Lock
import socket
def run(conn,client_addr):
while True:
try:
data = conn.recv(1024)
data = data.decode('utf-8')
print(f'接受到了来自{client_addr[0]}端口{client_addr[1]}传的{data}')
if data == '结束':
conn.send('断开此次连接'.encode('utf-8'))
break
conn.send('接受到了'.encode('utf-8'))
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
server = socket.socket()
server.bind(('192.168.1.171', 9000))
server.listen(5)
while True:
conn, client_addr = server.accept() # 程序开起来后等待接收,阻塞,不加这句可能死循环,直接让电脑死机
p = Process(target=run,args=(conn,client_addr))
p.start()
进程锁
'''进程锁是我们目前学习的第一把锁,锁在IT界非常重要,用的也非常多,MySQL中用锁的地方很多'''
比如:行锁,表锁,乐观锁,悲观锁...
# 所有锁的目的都是为了安全
from multiprocessing import Process,Lock
import time
def test(i,lock):
# 进入进程先上锁
lock.acquire()
print(f'进程{i}开启')
time.sleep(1)
print(f'进程{i}关闭')
lock.release() # 运行完毕释放锁
if __name__ == '__main__':
lock = Lock() # 拿到一把锁,只需要一把锁就行
for i in range(5):
# 一次开启多个进程的时候,哪个进程先开启或者结束不知道,需要操作系统来决定
p = Process(target=test,args=(i,lock))
p.start()
进程之间数据隔离问题
# 守护进程
'''进程之间的数据是相互隔离的,不能互相使用'''
from multiprocessing import Process
import time
x = 100
def test():
global x
x = 500
if __name__ == '__main__':
p = Process(target=test)
p.start()
p.join()
print(x)
队列Queue
'''数据结构:队列,链表,单链表,双链表,循环链表,栈,树:二叉树,平衡树,红黑树,b树,b+树,b-树,图'''
# 队列是先进先出的
1. 创建队列
2. 入队列
3. 出队列
from multiprocessing import Queue
if __name__ == '__main__':
q = Queue(3) # 创建一个长度为3的队列
q.put(1) # 入队列
q.put(2)
q.put(3)
# q.put(3, block=False) # 当block为False时如果队列满了直接报错,默认为Ture满了会等待出队列
# q.put(3, timeout=2) # timeout=一个数字,如果队列满了会等待出队列直到超时输入的数字为止就报错
# q.put(3) # 队列满了会一直等待下去
res = q.get() # 出队列
res1 = q.get()
res2 = q.get()
# res3 = q.get(block=False) # 当block为False时如果队列空了直接报错,默认为True也就是空了会等待入队列
# res3 = q.get(timeout=2) # timeout=一个数字,如果队列空了会等待入队列直到超时输入的数字为止就报错
print(res,res1,res2,res3)
# print(q.qsize()) # 查看队列中的成员
# print(q.full()) # 判断队列是否为空
解决进程之间的数据隔离
# 进程之间的通信(IPC)
from multiprocessing import Process,Queue
def test(q):
q.put(1) # 在子进程中入队列
if __name__ == '__main__':
q = Queue(5) # 创建队列
p = Process(target=test,args=(q,))
p.start() #在子进程中写入数据,去主进程中读取子进程中写的数据,如果能读到,说明通信了,如果读不到就不能通信
p.join()
print(q.get())
'''
此时, Queue队列中得数据是在内存中存着的
在实际工作中,队列我们会使用专业的消息队列:RabbitMq,Kafka,Rocket Mq...
Redis数据库(缓存)------>作为队列使用
'''
生产者消费者模型
生产者和消费者模式解决大多数的并发问题,
# 版本1:
# # 1. 生产者
# def producer(q):
# # 生产10个包子
# for i in range(10):
# q.put('生产了第%s个包子' % i)
#
#
# # 2. 消费者
# def consumer(q):
# while True:
# print(q.get())
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
# q = Queue(20)
# p = Process(target=producer, args=(q,))
# p.start()
#
# p1 = Process(target=consumer, args=(q,))
# p1.start()
# 版本2:
# 1. 生产者
# def producer(q):
# # 生产10个包子
# for i in range(10):
# q.put('生产了第%s个包子' % i)
# q.put(None) # 其实就是个标志位
#
#
# # 2. 消费者
# def consumer(q):
# while True:
# res = q.get()
# print(res)
# if res is None:
# break
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
# q = Queue(20)
# p = Process(target=producer, args=(q,))
# p.start()
#
# p1 = Process(target=consumer, args=(q,))
# p1.start()
# 版本3:
# def producer(q):
# # 生产10个包子
# for i in range(10):
# q.put('生产了第%s个包子' % i)
#
#
# # 2. 消费者
# def consumer(q):
# while True:
# res = q.get()
# print(res)
# if res is None:
# break
#
#
# from multiprocessing import Process, Queue
#
# if __name__ == '__main__':
# q = Queue(20)
# p = Process(target=producer, args=(q,))
# p.start()
#
# p1 = Process(target=consumer, args=(q,))
# p1.start()
# p.join()
# q.put(None) # 其实就是个标志位
# 版本4:多生产者,少消费者
def producer(q, food, name):
# 生产10个包子
for i in range(10):
q.put('%s生产了%s' % (name, food))
# 2. 消费者
def consumer(q):
while True:
res = q.get()
print(res)
if res is None:
break
from multiprocessing import Process, Queue
if __name__ == '__main__':
q = Queue(100)
p1 = Process(target=producer, args=(q, '馒头', 'ly'))
p2 = Process(target=producer, args=(q, '咖啡', 'kevin'))
p3 = Process(target=producer, args=(q, '烧麦', 'tony'))
p4 = Process(target=producer, args=(q, '奶茶', 'tank'))
p1.start()
p2.start()
p3.start()
p4.start()
p5 = Process(target=consumer, args=(q,))
p6 = Process(target=consumer, args=(q,))
p5.start()
p6.start()
p1.join()
p2.join()
p3.join()
p4.join()
q.put(None) # 其实就是个标志位
q.put(None) # 其实就是个标志位
# 布置个作业:少生产者,多消费者的情况
def producer(q, food, name):
# 生产10个包子
for i in range(10):
q.put('%s生产了%s' % (name, food))
# 2. 消费者
def consumer(q):
while True:
res = q.get()
print(res)
if res is None:
break
from multiprocessing import Process, Queue
if __name__ == '__main__':
q = Queue(100)
p1 = Process(target=producer, args=(q, '馒头', 'ly'))
p2 = Process(target=producer, args=(q, '咖啡', 'kevin'))
# p3 = Process(target=producer, args=(q, '烧麦', 'tony'))
# p4 = Process(target=producer, args=(q, '奶茶', 'tank'))
p1.start()
p2.start()
# p3.start()
# p4.start()
p5 = Process(target=consumer, args=(q,))
p6 = Process(target=consumer, args=(q,))
p7 = Process(target=consumer, args=(q,))
p8 = Process(target=consumer, args=(q,))
p5.start()
p6.start()
p7.start()
p8.start()
p1.join()
p2.join()
# p3.join()
# p4.join()
q.put(None) # 其实就是个标志位
q.put(None) # 其实就是个标志位
q.put(None) # 其实就是个标志位
q.put(None) # 其实就是个标志位
标签:总结,__,target,Process,args,29,start,课后,print
From: https://www.cnblogs.com/juzixiong/p/17270274.html