`
_念-H
  • 浏览: 9435 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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()

 

分享到:
评论

相关推荐

    进程与线程的生动形象理解

    ### 进程与线程的生动形象理解 #### 一、引言 进程与线程作为操作系统中的核心概念,对于理解和开发高效的软件至关重要。本文旨在通过一个生动的类比来帮助读者更好地理解进程与线程的基本概念及其差异,并进一步...

    进程和线程之间的关系

    对于初学者来说,理解进程与线程的关系至关重要,因为这有助于深入掌握操作系统的基本原理及应用。下面将详细阐述进程与线程之间的区别及其相互作用。 #### 一、进程的概念 进程是程序的一次执行过程,是系统进行...

    c++进程与线程

    总结,理解和掌握C++中的进程与线程是编写高性能、并发应用程序的关键。正确地利用它们可以提高程序的效率,但同时也需要关注同步和通信的细节,以避免潜在的问题。通过实践和学习,开发者能够更好地驾驭这个强大的...

    进程与线程的管理 .PPT 进程、线程和优先级

    进程与线程是操作系统中重要的概念,它们是执行程序的基础。在计算机系统中,进程可以理解为一个资源分配的基本单位,包含应用程序运行所需的所有资源,如内存、输入/输出设备等。而线程则是执行的基本单元,是进程...

    进程线程及死锁

    进程、线程、死锁和POSIX规范的系统调用 进程是操作系统中一个...7. 线程创建和管理 8. 死锁的避免和解决方法 注意:本摘要信息是根据给定的文件信息生成的,旨在提供相关的知识点和概念,但不包含无关紧要的内容。

    操作系统课程设计-linux进程与线程的通讯

    在操作系统课程设计中,Linux进程与线程的通信是一个核心且复杂的主题。在这个项目中,学生将深入理解操作系统内核如何管理和协调不同进程和线程之间的数据交换,从而实现高效的任务执行。以下是对这个主题的详细...

    进程与线程的一个简单解释

    了解和掌握进程与线程的区别和交互机制,对于编写高效的多线程程序至关重要。通过互斥锁和信号量等同步工具,我们可以有效地控制线程的并发访问,确保程序的正确性和性能。在实际开发中,合理地使用进程和线程,结合...

    进程与线程--小练习

    在计算机科学领域,进程与线程是操作系统中最基础且至关重要的概念。进程是程序执行时的一个实例,每个进程都有自己的独立内存空间,包括代码、数据、堆栈等资源。线程则是进程内的一个执行单元,它共享进程的内存...

    C++进程与线程详解

    鉴于网上和一些教材上对进程和线程说明不是很全面,在对这方面知识学习之后,进行了总结,对操作系统中进程与线程的关系和一些应用进行了整理,希望对有这方面需要的同道中人有所帮助。

    进程和线程详解

    进程和线程是计算机操作系统中的两个基本概念,对于任何软件开发者,尤其是系统级或服务器...通过阅读“进程和线程.doc”文档,可以进一步深入学习这两个主题的细节,包括它们的生命周期、调度策略、同步与通信方法等。

    c语言多进程多线程编程

    3. **线程通信与同步**:线程间的通信通常通过共享内存实现,因为它们本就属于同一个进程。线程同步可以使用`pthread_mutex_lock()`和`pthread_mutex_unlock()`进行互斥锁操作,或者使用条件变量(`pthread_cond_t`...

    基于c#的简单的进程与线程管理器

    本文将详细讲解如何使用C#语言来创建一个简单的进程与线程管理器,适合初学者入门。 首先,让我们了解基础概念。进程是操作系统中正在运行的一个程序实例,每个进程都有独立的内存空间,而线程则是进程内的执行单元...

    操作系统实验报告——线程与进程同步

    操作系统实验报告——线程与进程同步,主要探讨了在Linux环境下如何实现进程和线程的同步,以解决经典的生产者-消费者问题。该实验旨在帮助学生掌握操作系统提供的同步机制,并深化对经典同步问题的理解。 实验内容...

    \嵌入式linux开发教程之进程与线程--千锋培训

    嵌入式Linux开发教程深入探讨了进程与线程的概念及其在操作系统中的实现,这对于理解和开发高效、并发的嵌入式应用程序至关重要。以下是这些知识点的详细解释: **一、基础知识:线程和进程** 1. **进程**:是操作...

    Android Task 进程与线程详解

    "Android Task 进程与线程详解" Android 中的 Task 概念是指一组以栈的模式聚集在一起的 Activity 组件集合,具有潜在的前后驱关联。Task 的主要作用是将组件之间的连接,从进程概念的细节中剥离出来,可以以一种...

    操作系统中的进程与线程

    操作系统中的进程与线程是计算机科学中两个基本的并发执行单元。进程是操作系统资源分配的基本单位,它拥有独立的内存空间,包括代码、数据、堆栈等资源,而线程则是执行调度的基本单位,线程共享同一进程的内存资源...

    feiQhongzha进程与线程

    本文将深入探讨"feiQhongzha"这个场景下,进程与线程的应用。 首先,我们需要理解什么是进程。在操作系统中,进程是正在执行的一个程序实例,它拥有自己的内存空间,包括代码、数据和栈等。每个进程都有独立的资源...

    C#进程和线程资料集锦

    "C#进程和线程资料集锦"这一主题涵盖了进程与线程的基本概念、管理和同步技术,是C#开发者必备的知识库。 **进程与线程** 1. **进程**:进程是操作系统资源分配的基本单位,每个运行的应用程序都有一个独立的进程。...

    最清楚的进程线程,进程和线程对比

    线程基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可与同属一个进程的其他线程共享进程所拥有的全部资源。线程的存在使得操作系统可以同时调度同一进程中的多个...

Global site tag (gtag.js) - Google Analytics