python多线程多进程与Java区别(整理笔记9)
JavaJava编写的程序都运行在Java虚拟机里面,每用到Java命令启动一个Java应用程序,就会启动一个JVM进行。在同一个JVM进程中,有且只有一个进程,就是他自己。在这个JVM环境中,所有程序代码的运行都是运用线程来运行的。JVM找到程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程,当main方法结束后,主线程运行完成。JVM进程也随即...
·
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
更多推荐
已为社区贡献2条内容
所有评论(0)