7、进程与线程

1、多进程
A:Unix/Linux进程(windows不支持)

 

	import os
	# fork创建一个子进程
	pid = os.fork()
	# 子进程返回0
	if pid == 0:
		print 'this is child : %s ,parent:%s' % (os.getpid(),os.ppid())
	else
		print 'this is parent: %s' % os.getpid()

 

B:multiprocessing 夸平台支持多进程

 

	#coding=utf-8
	from multiprocessing import Process
	import os
	def myProc(name):
		print 'processing name :%s :%s' %(name,os.getpid())
	if __name__ == '__main__':
		print 'Parent process : %s' % os.getpid()
		# 创建一个进程 
		# target 进程启动时运行的方法,args第一个参数是进程名称
		pro = Process(target=myProc,args=('test',))
		pro.start() # 启动子进程 运行myPro方法
		pro.join()	# 子进程运行完后再往下执行
		print 'end'

 

C:Pool 启动大量进程

 

	from multiprocessing import Pool
	import os,time,random

	def myPro(name):
		print 'Run task %s (%s)...' % (name, os.getpid())
		start = time.time()
		# 进程休眠
		time.sleep(random.random() * 2) # 秒
		end = time.time()
		print 'Task %s runs %0.2f seconds.' % (name, (end - start))
	if __name__ == '__main__':
		# 设置同时可以运行多个进程,默认cpu个数
		p = Pool()
		for i in range(5):
			# 创建进程,并运行进程
			p.apply_async(myPro,args=(i,))
		print '----------start-------------'
		#time.sleep(30)
		p.close() # 保证之后不再添加新的进程
		p.join()  # 子进程都结束后再运行下边的程序
		print '----------end---------------'

 

D:进程之间的通信

 

	# Pipes一对一通信,效率高,Queue基于Pipes,可以多对多通信
	# 以Queue为例
	from multiprocessing import Process,Queue
	import os,time,random

	# 写
	def write(q,name):
		for v in ['1','2','3','4','5','6','7','8','9','0']:
			q.put(v)
			print 'who: %s write %s' % (name,v)
			time.sleep(random.random()*2)
	# 读
	def read(q,name):
		while True:	#时刻在读取Queue中数据
			print 'who: %s read %s' % (name,q.get(True))
			time.sleep(random.random()*1)
	if __name__ == '__main__':
		q = Queue()
		# 写 进程
		w = Process(target=write,args=(q,'w'))
		# 读 进程
		r = Process(target=read,args=(q,'r'))
		w.start()
		r.start()

		w.join()
		r.terminate() # 强制停止进程

 

2、多线程(进程中有一个或多个线程)
A:threading (对thread进行封装)

 

	import time,threading
	# 线程执行的代码
	def mydef():
		print 'who run : %s' % threading.current_thread().name
		n = 0
		while n < 5 :
			n = n + 1
			print 'thread %s --- %d' % (threading.current_thread().name,n) 
			time.sleep(1)
		print 'end: %s' % threading.current_thread().name

	if __name__ == '__main__':
		t1 = threading.Thread(target=mydef,name='thread_1')
		t2 = threading.Thread(target=mydef,name='thread_2')
		t1.start()
		t2.start()
		t1.join()
		t2.join()

 

B:Lock (线程锁,避免变量同时被多个线程操作)

 

	import time,threading
	number = 0
	def change(n):
		# 该数据同时被两个线程操作,造成数据的混乱
		global number
		number = number + n
		number = number - n

	def run(n):
		for i in range(1000):
			change(n)
		print number ,'\n'

	if __name__ == '__main__':
		thread1 = threading.Thread(target=run,args=(5,))
		thread2 = threading.Thread(target=run,args=(8,))
		thread1.start()
		thread2.start()
		thread1.join()
		thread2.join()
		print number

	# 使用 Lock() 实现变量的同步,将上边的run方法修改
	# 即 全局变量的操作必须加锁
	def run2(n):
	for i in range(1000):
		# 将该代码段锁住,是能同时被一个线程访问
		lock.acquire()
		try:
			change(n)
		finally:
			# 释放线程锁
			lock.release()
	print number ,'\n'

 

C:多核CPU

        多核可以同时执行多个线程。

        但是在Python中,有GIL(Global Interpreter Lock)锁,故线程被上锁,是交替运行的。

 

        所以,在多核CPU中运用线程是徒劳的。

 

3、ThreadLocal

在线程中, 局部变量的传递是通过方法的参数传递的,但是调用多层的方法时,会很麻烦。

使用ThreadLocal可以解决局部变量传递的问题。

	import threading 
	# local是一个dict 键值对
	local = threading.local()
	def run(name):
		# 设置传递局部变量参数
		local.name = name
		# 因为是局部变量,所以不需要设置锁
		for i in range(1000):
			addB()
			

	def addB():
		# 获取局部变量参数
		name = local.name + '+B'
		print '%s = %s \n' % (threading.current_thread().name,name)

	if __name__ == '__main__':
		p1 = threading.Thread(target=run,args=('p1',),name='thread_1')
		p2 = threading.Thread(target=run,args=('p2',),name='thread_2')
		p1.start()
		p2.start()
		p1.join()
		p2.join()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在风能领域,准确预测风速对于风电场的运行与管理至关重要。Matlab作为一个强大的数学计算和数据分析平台,被广泛应用于风速预测模型的构建。本文将深入探讨基于四种风速——随机风、基本风、阵风和渐变风的组合风速预测技术。 我们来理解这四种风速类型: 1. **随机风**:随机风是指风速呈现出随机性的变化,通常由大气湍流引起。在建模中,通常通过统计方法如高斯分布或Weibull分布来模拟这种不确定性。 2. **基本风**:基本风速是指在无特定扰动条件下的平均风速,它是长期观测结果的平均值,通常用于结构设计和风能评估。 3. **阵风**:阵风是短时间内风速显著增强的现象,对建筑物和风力发电机造成的主要威胁之一。阵风的预测涉及到风的脉动特性分析。 4. **渐变风**:渐变风是指风速随时间和空间逐渐变化的过程,常见于风向转变或地形影响下的风场变化。 在Matlab中,利用这四种风速类型进行组合预测,可以提高预测的准确性。预测模型可能包括以下几个步骤: 1. **数据收集与预处理**:收集历史风速数据,包括随机风、基本风、阵风和渐变风的数据,进行异常值检测、缺失值填充以及数据标准化。 2. **特征工程**:提取风速变化的相关特征,如平均值、标准差、极值、频率分布等,这些特征可能对预测有重要影响。 3. **模型选择**:可以选择多种预测模型,如时间序列分析(ARIMA、状态空间模型等)、机器学习算法(线性回归、决策树、支持向量机、神经网络等)或深度学习模型(LSTM、GRU等)。 4. **模型训练**:利用历史数据训练选定的模型,调整模型参数以优化性能,例如通过交叉验证来避免过拟合。 5. **模型验证与评估**:使用独立的测试集验证模型预测效果,常见的评估指标有均方误差(MSE)、平均绝对误差(MAE)和决定系数(R²)。 6. **组合预测**:结合四种风速的不同模型预测结果,可以采用加权平均、集成学习(如bagging、boosting)等方式,以提升整体预测精度。 7. **实时更新与动态调整**:实际应用中,模型需要不断接收新的风速数据并进行在线更新,以适应风场环境的变化。 通过以上步骤,可以构建一个综合考虑各种风速特性的预测系统,这对于风电场的功率输出预测、风电设备的维护计划以及电网调度都具有重要价值。然而,需要注意的是,每个风场的地理环境、气候条件和设备状况都有所不同,因此模型的建立应根据实际情况进行定制和优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值