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

 

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
'''

 

 

 

 

 

 

 
posted @ 2019-06-20 15:50  minger_lcm  阅读(247)  评论(0编辑  收藏  举报