Python快速入门(十三)多进程
前言:主要介绍使用继承实现多任务、获取进程的pid、进程的运行顺序、给process传递参数、通过queue来实现数据共享、进程池等介绍。
1.使用进程实现多任务
代码:
import time
import multiprocessing
def test1():
while True:
print("1----")
time.sleep(1)
def test2():
while True:
print("2----")
time.sleep(1)
def main():
p1 = multiprocessing.Process(target=test1)
p2 = multiprocessing.Process(target=test2)
p1.start()
p2.start()
if __name__ == '__main__':
main()
运行截图:
2.获取进程的pid
代码:
import os
import time
import multiprocessing
def test1():
while True:
print("子进程 pid = %d 父进程 pid = %d" % (os.getpid(), os.getppid()))
time.sleep(1)
def main():
print("主进程 pid = %d 父进程 pid = %d" % (os.getpid(), os.getppid()))
p1 = multiprocessing.Process(target=test1)
p1.start()
if __name__ == '__main__':
main()
运行截图:
3.进程的运行顺序
代码:
import os
import time
import multiprocessing
def test1():
while True:
print("子进程1 pid = %d 父进程 pid = %d" % (os.getpid(), os.getppid()))
time.sleep(1)
def test2():
while True:
print("子进程2 pid = %d 父进程 pid = %d" % (os.getpid(), os.getppid()))
time.sleep(1)
def main():
print("主进程 pid = %d 父进程 pid = %d" % (os.getpid(), os.getppid()))
p1 = multiprocessing.Process(target=test1)
p1.start()
p2 = multiprocessing.Process(target=test2)
p2.start()
if __name__ == '__main__':
main()
运行截图:
4.给process传递参数
代码:
import multiprocessing
import os
def test(a, b, c, *args, **kwargs):
print(a)
print(b)
print(c)
print(args)
print(kwargs)
def main():
print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid()))
p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm": 11})
p.start()
if __name__ == '__main__':
main()
运行截图:
5.多进程之间不共享全局变量
import multiprocessing
import os
import time
nums = [11, 22, 33]
def test():
nums.append(44)
print("在进程中1中nums = %s" % str(nums))
time.sleep(3)
def test2():
print("在进程中2中nums = %s" % str(nums))
def main():
print("主进程 pid = %d 父进程pid = %s" %(os.getpid(), os.getppid()))
p = multiprocessing.Process(target=test)
p.start()
# time.sleep(1)
p.join()
p2 = multiprocessing.Process(target=test2)
p2.start()
if __name__ == '__main__':
main()
运行截图:
6.多进程之间通过queue来实现数据共享
import multiprocessing
"""
一个进程向Queue中写入数据,另外一个进程从Queue中获取数据,
通过Queue完成了 多个需要配合的进程间的数据共享,从而能够 起到 解耦的作用
"""
def download_from_web(q):
"""下载数据"""
# 模拟从网上下载的数据
data = [11, 22, 33, 44]
# 向队列中写入数据
for temp in data:
q.put(temp)
print("---下载器已经下载完了数据并且存入到队列中----")
def analysis_data(q):
"""数据处理"""
waitting_analysis_data = list()
# 从队列中获取数据
while True:
data = q.get()
waitting_analysis_data.append(data)
if q.empty():
break
# 模拟数据处理
print(waitting_analysis_data)
def main():
# 1. 创建一个队列
q = multiprocessing.Queue()
# 2. 创建多个进程,将队列的引用当做实参进行传递到里面
p1 = multiprocessing.Process(target=download_from_web, args=(q,))
p2 = multiprocessing.Process(target=analysis_data, args=(q,))
p1.start()
p2.start()
if __name__ == "__main__":
main()
运行截图:
7.进程池
代码:
import multiprocessing
def worker(name1, name2):
new_name = name1+name2
print(new_name)
def main():
# 创建进程池
po = multiprocessing.Pool(5)
# 向进程池中添加任务
for i in range(0,10):
po.apply_async(worker, args=("fly1-{}".format(i), "fly2--{}".format(i)))
po.close()
po.join()
if __name__ == "__main__":
main()
运行截图:
结束!