首页 > 编程语言 > 详细

python 并发编程 多线程与多进程的区别

时间:2019-06-20 16:00:21      阅读:103      评论:0      收藏:0      [点我收藏+]

 

1.开进程的开销远大于开线程

2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的

 

 

1 开进程的开销远大于开线程
from multiprocessing import Process

def work():
    print(hello)

if __name__ == __main__:
    #在主进程下开启子进程
    p = Process(target=work)
    p.start()
    print(主进程)
    
    
‘‘‘
主进程
hello
‘‘‘

执行结果如下,p.start ()将开启进程的信号发给操作系统后,操作系统要申请内存空间,让好拷贝父进程地址空间到子进程,开销远大于线程

先打印的是主进程

 
from threading import Thread

def work():
    print(hello)

if __name__ == __main__:
    t = Thread(target=work)
    t.start()
    print(主线程)


‘‘‘
hello
主线程
‘‘‘

执行结果如下,几乎是t.start ()的同时就将线程开启了,然后先打印出了hello,开线程不用申请内存空间,证明线程的创建开销极小

 

2 同一进程内的线程共享该进程的数据?

1、进程之间地址空间是隔离的

from multiprocessing import Process

def work():
    global n
    n = 0

if __name__ == __main__:
    n = 100
    p = Process(target=work)
    p.start()
    p.join()
    print(, n)


‘‘‘
主 100
‘‘‘

执行结果如下,毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100,
子进程不影响主进程


2、同一进程内开启的多个线程是共享该进程地址空间的
# 2 同一进程内的多个线程共享该进程的地址空间

from threading import Thread

def work():
    global n
    n = 0

if __name__ == __main__:
    n = 100
    t = Thread(target=work)
    t.start()
    t.join()
    print(,n)

‘‘‘
主 0
‘‘‘

执行结果如下, 查看结果为0, 因为同一进程内的线程之间共享进程内的数据 

 
三 pid
1.开多个进程,每个进程都有不同的pid

current_process 可以查看pid
# 3 pid

from multiprocessing import Process
from multiprocessing import current_process

# current_process 可以查看pid

def work(name):
    print("%s" %name,current_process().pid)  # 当前子进程id

if __name__ == __main__:

    p = Process(target=work, args=("子进程",))
    p.start()
    print(, current_process().pid)  # 主进程id


‘‘‘
主 5880
子进程 5092
‘‘‘


os模块查看pid
from multiprocessing import Process
import os


def work():
    print("子进程:%s , 父进程:%s" %(os.getpid(), os.getppid()))  # 子进程pid

if __name__ == __main__:

    p = Process(target=work)
    p.start()
    print(, os.getpid())  # 主进程pid


‘‘‘
主 15420
子进程:17024 , 父进程:15420
‘‘‘

2.在主进程下开启多个线程,每个子线程都跟主进程的pid一样

他们同属一个进程

# 3 pid

from threading import Thread
import os


def work():
    print("子线程PID:%s" %(os.getpid()))  # 子线程pid

if __name__ == __main__:

    t = Thread(target=work)
    t.start()
    print(, os.getpid())  # 主线程pid


‘‘‘
子线程PID:4328
主 4328
‘‘‘

 

 

 

 

 

 

 

python 并发编程 多线程与多进程的区别

原文:https://www.cnblogs.com/mingerlcm/p/9015342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!