python多线程多进程与Java区别(整理笔记9)

14 篇文章 1 订阅
1 篇文章 0 订阅

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hokool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值