进程与线程的区别

一 开启线程速度快于进程

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

  进程

# 1、开进程的开销远大于开线程的

import time
from multiprocessing import Process


def work(name):
    print("%s is working " % name)
    time.sleep(2)
    print("%s end" % name)


if __name__ == "__main__":
    p1 = Process(target=work, args=("进程1", ))
    p1.start()     # print("主线程")打印完了,子进程才起来

    print("主进程")

  执行结果

主进程
进程1 is working
进程1 end

线程

 

import time
from threading import Thread


def work(name):
    print("%s is working " % name)
    time.sleep(2)
    print("%s end" % name)


if __name__ == "__main__":
    t1 = Thread(target=work, args=("线程1", ))
    t1.start()      # 指令发出,效果立马出现
    print("主线程")

 

  执行结果

线程1 is working
主线程
线程1 end

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

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

from multiprocessing import Process

n = 100
def task():
    global n
    n = 0

if __name__ == "__main__":
    p1 = Process(target=task,)
    p1.start()    # 主进程n=100,子进程n=0(改的是子进程的,不影响主进程)
    p1.join()

    print("主进程", n)

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

主进程 100

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

from threading import Thread

n = 100
def task():
    global n
    n = 0

if __name__ == "__main__":
    t1 = Thread(target=task, )
    t1.start()      # 发信号后,在同一进程中开了一个线程,共享进程资源
    t1.join()

    print("主线程", n)

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

主 0

三 查看pid

1、在主进程下开启多个线程,每个线程都跟主进程的pid一样

from threading import Thread
import os


def task():
    print("线程1PID:%s " % os.getpid())

if __name__ == "__main__":
    t1 = Thread(target=task, )
    t1.start()

    print("主线程", os.getpid())

执行结果

线程1PID:6436
主线程 6436

2、开多个进程,每个进程都有不同的pid

from multiprocessing import Process, current_process
import os


def task():
    # print(current_process().pid)
    print("子进程PID:%s | 父进程PID:%s" %(os.getpid(), os.getppid()))

if __name__ == "__main__":
    p1 = Process(target=task,)
    p1.start()

    # print("主进程", current_process().pid)
    print("主进程", os.getpid())

执行结果

主进程 6232
14912
子进程PID:14912 | 父进程PID:6232

 
posted @ 2018-12-17 01:21  混世妖精  阅读(162)  评论(0编辑  收藏  举报