Python多进程
- 多进程就像生产者和消费者的关系一样
- 比如统计信息:一个负责打开,一个负责处理;或者一个搜索,一个爬
- 队列:先进先出 例如:queue
栈:先进后出 例如:网页(打开A里的B里的C,再返回,返回的路径是C到B再到A)
multiprocess
- multiprocessing包是Python中的多进程管理包,利用multiprocessing.Process对象来创建一个进程。
- 当某个进程终结之后,需要让主进程等待子进程,调用join()方法
- multiprocessing提供了Pipe和Queue,效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。
- 多进程的共享:在多线程中,可以比较容易地共享资源,比如使用全局变量或者传递参数。但在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过Array(进程列表数组共享)和Manager(进程字典列表共享)的方法来共享资源。
join
让主进程等待子进程
import multiprocessing
import os
def info(title):
print(title)
print(__name__)
print('father', os.getppid())
print('self', os.getpid())
print('--------')
if __name__ == "__main__": # 除了创建的子进程和子进程调用函数,其他的都是脚本主进程
# info('hello')
# 创建一个子进程调用函数
P = multiprocessing.Process(target=info,args=('hello python',))
P.start()
P.join() # 和多线程一样,也是等待的意思
print('hello word') # 若没有join则会独立运行
"""
结果:
hello python
__mp_main__
father 12500
self 8164
---------
hello word
"""
Lock
- 进程锁,可有可无(多个进程同时对同一文件处理时可使用)
- 作用:进程写完出去下个再进来
- RLock 活动锁
- Lock 锁不好就会锁死
# 当进程进行文件读写操作的时候(关键性操作的时候)需要使用锁..
from multiprocessing import Process,RLock
import multiprocessing
def _write(str_,lock):
print(multiprocessing.current_process().name)
# 写入文件
path = '/D:/school/python/work/http.txt'
# with 会自己帮你关掉
with lock:
# 路径 模式a:追加 # 编码模式:utf-8, gbk,gb12128
with open(path, mode='a'