Java

Java编写的程序都运行在Java虚拟机里面,每用到Java命令启动一个Java应用程序,就会启动一个JVM进行。在同一个JVM进程中,有且只有一个进程,就是他自己。在这个JVM环境中,所有程序代码的运行都是运用线程来运行的。JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程,当main方法结束后,主线程运行完成。JVM进程也随即退出。

Python

python的多线程实际上并不能真正利用多核,所以如果使用多线程,实际上还是在一个核上做并发处理。不过,如果利用多进程,就可以真正利用多核,因为各进程之间是相互独立的,不共享资源,可以在不同核上执行不同的进程,达到并行效果。

python多进程库multiprocessing

基于process的多进程

from multiprocessing import Process
	def f(name):
		print 'hello', name
	
	if __name__ == '__main__':
		p = Process(target=f, args=('bob',))	# 新建一个子进程p,目标函数f,args是函数f的参数列表
		p.start()	# 开始执行进程
		p.join()	# 等待子进程结束

基于进程池Pool的多进程

import multiprocessing
import time
	def func(msg):
		print multiprocessing.current_process().name + '-' + mgs
	
	if __name__ == '__main__':
		pool = multiprocessing.Pool(processes=4)	# 创建四个子进程
		for i in xrange(10):
			msg = 'hello %d' % i
			pool.apply_async(func, (msg,))
		pool.close()	# 关闭进程池,表示不能在往进程池里面添加进程
		pool.join()	# 等待进程池里面所有进程执行完毕,必须在close()之后调用
		print "Sub-process(es) done"

进程与线程的数据共享

# multiprocessing模块提供了一个Process类来代表一个进程对象
import multiprocessing
from multiprocessing import Process
import threading

def run(lock1, info_list,i):
	with lock1:
		info_list.append(i)
		print(info_list)

def run2(info_list, i):
	lock2.acquire()
	info_list.append(i)
	print(info_list)
	lock2.release()
	
info = []

# 多进程执行,内存是独立的,每个进程都独立的copy一份
lock1 = multiprocessing.Lock()
for i in range(10):
	p = Process(target=run, args=(lock1, info, i))
	p.start()
	
# 多线程执行,内存是共享的
lock2 = threading.Lock()
for i in range(10):
	p = threading.Thread(target=run, args=(lock1, info, i))
	p.start()
	p.join()

# 因此想进行进程间的通信,需要一个桥梁

由于多进程间内存不共享,因此要进行进程间通信的时候,需要一个队列Queue进行中转,from multiprocessing import Queue即可,也可以使用Value, Array来共享内存,使得进程间共享数据,可以进行修改等操作,例如:

from multiprocessing import Process,Array,Value

def f(n, a):
	n.value = 3.1415926
	for i in range(len(a)):
		a[i] = -a[i]
		
if __name__ == '__main__':
	num = Value("d", 0.0)
	array = Array("i", range(10))
	print(num.value, array[:])
	p = Process(target=f, args=(num,array))
	p.start()
	p.join()
	print(num.value, array[:])

通过Value与Array使得子进程可以修改num与array

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐