1.进程的基本使用:
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print('name:{0}--pid:{1}'.format(self.name, self.pid))
if __name__ == '__main__':
p = MyProcess()
p.start()
p.join()
控制台输出:
name:MyProcess-1--pid:45612
2.进程池:
from multiprocessing import Process, current_process, Pool
def func(num):
pid = current_process().pid
# 进程获得pid和name可以直接用multiprocessing中的current_process
name = current_process().name
print('num:{0},pid:{1},name:{2}'.format(num, pid, name))
if __name__ == '__main__':
pool = Pool(4)
n_list = range(100)
for n in n_list:
# pool.apply_async(func, args=(n,))
pool.apply(func, args=(n,))
pool.close()
pool.join()
如果使用异步apply_async,或者与开启的线程数相比,任务数比较少,使用的进程数就不一定有指定的那么多,可能只有1或2个进程在跑任务
3.通过Queue进行通信:进程之间是相互隔离的,要实现进程间通信,multiprocessing提供了队列和管道的方式,管道不自动加锁,此处使用的是队列方式:
(一方通过put写入数据,一方通过get获得数据)
from multiprocessing import Process,current_process,Queue
class WriteProcess(Process):
def __init__(self, q, *args, **kwargs):
super().__init__(*args, **kwargs)
self.q = q
def run(self):
context = [
'第一行内容',
'第二行内容',
'第三行内容'
]
for each in context:
print('写入内容:{0},名字:{1}'.format(each, current_process().name))
self.q.put(each)
class ReadProcess(Process):
def __init__(self, q, *args, **kwargs):
super().__init__(*args, **kwargs)
self.q = q
def run(self):
while True:
print(self.q.get())
if __name__ == '__main__':
q = Queue() # 通过q来通信
w = WriteProcess(q)
r = ReadProcess(q)
w.start()
r.start()
w.join()
r.terminate()
# 由于读的代码写的是死循环,且没有再有子进程了,
# 所以使用terminate终止程序
4.进程锁
同样在class的定义中传入lock,加锁并释放锁,或者使用with操作:
from multiprocessing import Process,current_process,Queue,Lock
import time
class WriteProcess(Process):
def __init__(self, lock, num, *args, **kwargs):
super().__init__(*args, **kwargs)
# self.q = q
self.lock = lock
self.num = num
def run(self):
with self.lock:
for i in range(10):
with open('test2.txt', 'w', encoding='utf-8') as f:
context = '写入内容:i:{0}, pid:{1}, num:{2}'.format(i, self.pid,self.num)
f.write(context)
f.write('\n')
print(context)
time.sleep(2)
if __name__ == '__main__':
lock = Lock()
for i in range(5):
w1 = WriteProcess(lock,i)
w1.start() # 此处不用join,否则一条进程结束后才会起第二条进程
控制台部分输出:(每个进程都会先执行完10次的打印,才会到下一个)
写入内容:i:0, pid:65248, num:0
写入内容:i:1, pid:65248, num:0
写入内容:i:2, pid:65248, num:0
写入内容:i:3, pid:65248, num:0
写入内容:i:4, pid:65248, num:0
写入内容:i:5, pid:65248, num:0
写入内容:i:6, pid:65248, num:0
写入内容:i:7, pid:65248, num:0
写入内容:i:8, pid:65248, num:0
写入内容:i:9, pid:65248, num:0