python学习笔记(二十六)python的进程操作

目录

一、单进程

二、启动大量子进程

三、全局变量在多个进程中不能共享

四、父子进程之间的先后顺序

五、进程间通信

六、文件拷贝

1、普通方法实现

2、多进程方法实现


一、单进程

from multiprocessing import Process
import time

#multiprocessing:跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象

def run(str):
	while True:
		print('hello %s...'%(str))
		time.sleep(1.5)


if __name__ == '__main__':
	print('主进程启动')
	# 创建子进程
	# target说明进程执行的任务
	p = Process(target=run,args=("java",))
	# 启动进程
	p.start()
	# 主进程运行
	while True:
		print('I dont want see you anymore...')
		time.sleep(1)

二、启动大量子进程

from multiprocessing import Pool
import time
import os, random


def run(num):
	print('子进程%d启动——%s' % (num, os.getpid()))
	start = time.time()
	# 随机暂停时间
	time.sleep(random.choice([1, 2, 3]))
	end = time.time()
	print('子进程%d结束——%s,耗时:%d' % (num, os.getpid(), end - start))


if __name__ == '__main__':
	print('父进程启动')

	# 创建多个进程
	# 进程池,参数表示可以同时进行的进程数量,默认大小是CPU核心数量
	pc = Pool(3)
	for i in range(5):
		# 创建进程放入进程池统一管理
		pc.apply_async(run, args=(i,))
	# 在调用join之前必须先调用close,调用close之后不能再继续添加新的进程了
	pc.close()
	# 进程池对象调用join,会等待进程池中所有子进程结束完毕再去执行父进程
	pc.join()

	print('父进程结束')

三、全局变量在多个进程中不能共享



from multiprocessing import Process
from time import sleep
num = 100

def run():
	print("子进程开始")
	global num #引入num
	num += 1
	print(num)
	print("子进程结束")

if __name__=="__main__":
	print("父进程开始")

	p = Process(target=run)
	p.start()
	p.join()

	#在子进程中修改全局变量对父进程中的全局变量没有影响
	#在创建子进程时对全局变量做了一个备份,父进程中与子进程中的num是两个完全不同的变量
	print("父进程结束--%d"%num)


'''
运行结果
父进程开始
子进程开始
101
子进程结束
父进程结束--100
'''

四、父子进程之间的先后顺序

from multiprocessing import Process
import time
from time import sleep

def run(str):
	while True:
		print("启动子进程")
		sleep(3)
		print("子进程结束")


if __name__ == '__main__':
	print('主进程启动')

	p = Process(target=run,args=("java",))
	# 启动进程
	p.start()
	#父进程的结束不能影响子进程,让父进程等待子进程结束再执行父进程
	p.join()
	print('父进程结束')

五、进程间通信

from multiprocessing import Queue, Process
import os, time


def write(q):
	print('启动写子进程%s' % os.getpid())
	for chr in ['A', 'B', 'C', 'D']:
		q.put(chr)
		time.sleep(1)
	print('结束写子进程%s' % os.getpid())


def read(q):
	print('启动读子进程%s' % os.getpid())
	while True:
		value = q.get(True)
		print('value:', value)
	print('结束读子进程%s' % os.getpid())


if __name__ == '__main__':
	# 进程间通信,父进程需要创建一个队列,并传递给子进程
	q = Queue()
	pw = Process(target=write, args=(q,))
	pr = Process(target=read, args=(q,))

	pw.start()
	pr.start()
	pw.join()
	# pr进程里是一个死循环,无法等待结束,只能强行结束terminate(),如果写进程结束,那么读进程结束
	pr.terminate()
	print('父进程结束')

六、文件拷贝

1、普通方法实现

import os,time
from multiprocessing import Pool


#实现文件的拷贝
def copyFile(rPath,wPath):
	fr = open(rPath,"rb")
	fw = open(wPath,"wb")
	context = fr.read()
	fw.write(context)
	fr.close()
	fw.close()

path = r"F:\学习存放\untitled\进程与线程\多任务原理\进程"
toPath =r"F:\学习存放\untitled\进程与线程\多任务原理\copy"

#读取path下的全部文件
fileList = os.listdir(path)

#启动for循环处理每一个文件
start = time.time()
for fileName in fileList:
	copyFile(os.path.join(path,fileName),os.path.join(toPath,fileName))

end = time.time()
print("总耗时:%0.2f"%(end-start))

2、多进程方法实现

import os,time
from multiprocessing import Pool


#实现文件的拷贝
def copyFile(rPath,wPath):
	fr = open(rPath,"rb")
	fw = open(wPath,"wb")
	context = fr.read()
	fw.write(context)
	fr.close()
	fw.close()

path = r"F:\学习存放\untitled\进程与线程\多任务原理\进程"
toPath =r"F:\学习存放\untitled\进程与线程\多任务原理\copy"



if __name__ =="__main__":
	# 读取path下的全部文件
	fileList = os.listdir(path)

	start = time.time()
	pp = Pool(2)
	for fileName in fileList:
		pp.apply_async(copyFile,args=(os.path.join(path,fileName),os.path.join(toPath,fileName)))

	pp.close()
	pp.join()
	end = time.time()
	print("总耗时: %0.2f"%(end-start))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值