#!/usr/bin/env python
# -*- coding: utf-8 -*-
import multiprocessing
import time
'''
关键:
1 multiprocessing.Process(group=None, target=None, args=(), kwargs={})
target:可调用的函数名,将会被run()调用
args: target被调用方法的元组参数
kwargs:字典参数列表
multiprocessing.start()
开启进程活动,需要被调用,开启子进程
multiprocessing.join([timeout])
阻塞当前进程,直到子进程执行完毕或超时
terminate(): 终止进程
multiprocessing.cpu_count():返回系统中CPU的个数
2 锁
多个进程访问共享资源,Lock可以避免访问冲突
multiprocessing.Lock():初始化
Lock.acquire():获取锁
Lock.release():释放锁
with lock: 获取锁和释放锁一起
3 多进程之间通信可用队列
multiprocessing.Queue.get([block[, timeout]])
block: True:表示阻塞,直到获取到一个元素
ref:
https://docs.python.org/2/library/queue.html#Queue
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868323401155ceb3db1e2044f80b974b469eb06cb43000
https://blog.csdn.net/dutsoft/article/details/54694798
https://docs.python.org/2/library/multiprocessing.html
'''
def readQueue(myQueue):
while True:
value = myQueue.get(True)
if value:
print 'get value: {value}'.format(value=value)
def writeQueue(myQueue, datas=None):
for data in datas:
myQueue.put(data)
print "set value: {value}".format(value=data)
def processQueue():
myQueue = multiprocessing.Queue()
reader = multiprocessing.Process(target=readQueue, args=(myQueue,))
writer = multiprocessing.Process(target=writeQueue, args=(myQueue,), kwargs={'datas': range(1,3)})
reader.start()
writer.start()
writer.join()
# NOTE: it needs to put reader.join() after writer.join(), otherwise there is blocking
reader.join()
def taskWrite(lock, f):
with lock:
with open(f, "w+") as f:
f.write("hello ")
time.sleep(1)
def taskWriteAppend(lock, f):
lock.acquire()
try:
with open(f, "a+") as f:
time.sleep(1)
f.write("world!")
except Exception as ex:
print ex
finally:
lock.release()
def processLock():
lock = multiprocessing.Lock()
fileName = "./file.txt"
p1 = multiprocessing.Process(target=taskWrite, args=(lock, fileName,))
p2 = multiprocessing.Process(target=taskWriteAppend, args=(lock, fileName,))
p1.start()
p2.start()
p1.join()
p2.join()
with open(fileName, 'r') as f:
for x in f.readlines():
print x
def process():
processLock()
processQueue()
if __name__ == "__main__":
process()
python 64式: 第14式、多进程,队列与锁
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/83859155
今日推荐
周排行