学习笔记(24):Python网络编程&并发编程-进程与线程的区别

立即学习:https://edu.csdn.net/course/play/24458/296438?utm_source=blogtoedu

线程与进程的区别:

1.消耗区别:进程>线程

1)进程运行结果

#进程运行
from multiprocessing import Process
def task(name):
    print("我是%s"%name)

if __name__ == '__main__':
    p1 = Process(target=task,args=('子进程',))
    p1.start()

    print('主进程')

进程运行结果:

 2)线程运行结果

from threading import Thread
def task(name):
    print("我是%s"%name)

if __name__ == '__main__':
    p1 = Thread(target=task,args=('子线程',))
    p1.start()

    print('主线程')

线程运行结果:

3)分析:在两端代码中,除了模块的不一样,代码的顺序都是一样的,但是运行的结果的顺序是不一样的。进程运行中是主进程先打印再打印的子进程,这是因为新建一个进程需要申请内存空间时间较长,而线程恰恰相反。所以进程消耗大于线程。注:同一进程里面的线程是平级的,没有父线程子线程的说法,为了方便理解才说的

2.地址共享问题:进程之间不共享,同一进程线程之间共享

1)线程之间

from threading import Thread
n = 100
def task(name):
#声明全局变量,并且修改了n的值
    global n
    n = 0
    print("我是%s"%name)

if __name__ == '__main__':
    #开启了一个新的线程,会改变n的值
    t1 = Thread(target=task,args=('子线程',))
    t1.start()

    print('主线程','n=%s'%n)#由于主线程和子线程之间是共享地址空间的即数据,所以线程n的改变也会共享到主线程中
#在主进程下运行了一个主线程和一个子线程(新建的线程)

线程运行结果:

2)进程运行

from multiprocessing import Process
n = 100
def task(name):
    global n
    n = 0
    print("我是%s"%name)

if __name__ == '__main__':
    #开启了一个新的进程
    p1 = Process(target=task,args=('子进程',))
    p1.start()

    print('主进程','n=%s'%n)
#在新的进程中,n的值已经被改变成了0,在主进程中进行n的值的打印,得到的是全局变量n=100,说明进程之间的数据是不共享的,其值的改变包含影响到其他进程值

进程运行结果:

3.pid

查看当前进程pid的方法:

1)multiprocessing.current_process().pid

2)os.getpid()

查看当前进程ppid()的方法:父进程pid

os.getppid()

不同进程pid

from multiprocessing import Process,current_process
n = 100
def task(name):
    global n
    n = 0
    print("我是%s"%name,current_process().pid)

if __name__ == '__main__':
    #开启了一个新的线程
    p1 = Process(target=task,args=('子进程',))
    p1.start()

    print('主进程','n=%s'%n,current_process().pid)

子进程的pid与父进程pid不同

 不同线程pid

from threading import Thread
import os
n = 100
def task(name):
    global n
    n = 0
    print("我是%s"%name,os.getpid())

if __name__ == '__main__':
    #开启了一个新的线程
    t1 = Thread(target=task,args=('子线程',))
    t1.start()

    print('主线程','n=%s'%n,os.getpid())
#在主进程下运行了一个主线程和一个子线程(新建的线程)

不同线程pid一样

 

发布了39 篇原创文章 · 获赞 11 · 访问量 402

猜你喜欢

转载自blog.csdn.net/qq_45769063/article/details/105072122
今日推荐