如何理解同一进程下的线程不需要进行通讯的概念

如何理解同一进程下的线程不需要进行通讯的概念

如题,如何理解这区别之中的第二条同一进程下的不同线程之间需要通讯不需要使用通讯这句话?

之前的课程中也特意去讲了进程之间创建队列

import threading

q = queue.Queue()

为什么总结里面说明统一进程下的线程之间不需要进行通讯,那么这些线程之间是如何进行数据传输的呢?

https://img1.sycdn.imooc.com//climg/646cb4a309307a1905920150.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!第二条意思是进程之间数据是不共享的,若想实现共享数据需要用进程间的通信方法才能实现数据共享,而线程之间本身就可以实现数据共享的,所以不需要其他的通信方式实现数据共享

# _*_ coding:utf-8 _*_
from threading import Thread  # 导入线程
import time


def plus():
    print("-------子线程1开始---------")
    global g_num  # 定义全局变量
    g_num += 50  # 全局变量值加50
    print("g_num is %d" % g_num)
    print("-------子线程1结束---------")


def minus():
    time.sleep(2)
    print("-------子线程2开始---------")
    global g_num  # 定义全局变量
    g_num -= 50  # 全局变量值减50
    print("g_num is %d" % g_num)
    print("-------子线程2结束---------")


g_num = 100  # 定义一个全局变量

if __name__ == "__main__":
    print("----------主线程开始-------------")
    print("g_num is %d" % g_num)
    t1 = Thread(target=plus)  # 实例化线程t1
    t2 = Thread(target=minus)  # 实例化线程t2
    t1.start()  # 开启线程t1
    t2.start()  # 开启线程t2
    t1.join()  # 等待t1线程结束
    t2.join()  # 等待t2线程结束
    print("--------主线程结束-------------")

上述代码中,定义一个全局变量g_num,赋值为100,然后创建2个线程。一个线程将g_num增加50,一个线程将g_num减少50。如果g_num的最终结果为100,则说明线程之间可以共享数据,运行结果如下图所示:

https://img1.sycdn.imooc.com//climg/646d6fc709d6a7be06940349.jpg

祝学习愉快~

  • 懒惰的围脖 提问者 #1
    既然线程可以直接进行数据共享,为什么还需要进行线程队列的创建去传输数据呢?
    2023-05-24 12:43:56
  • 好帮手慕小猿 回复 提问者 懒惰的围脖 #2

    同学,你好!线程的本身数据共享指的是将变量设置为全局变量,可以实现数据共享。若是不设置为全局变量。在minus()函数内无法获取plus()函数设置的g_num的值,pycharm()语法检测不通过爆红,代码也报错

    https://img1.sycdn.imooc.com//climg/646da9720952876509330800.jpg

    这种情况下可以使用队列在plus函数内存储数据,minus()函数内获取数据

    from threading import Thread  # 导入线程
    import time
    import threading
    from queue import Queue
    
    def plus():
        print("-------子线程1开始---------")
        g_num=0  # 定义全局变量
        g_num += 50  # 全局变量值加50
        print("g_num is %d" % g_num)
        q.put(g_num)
        print("-------子线程1结束---------")
    def minus():
        time.sleep(2)
        print("-------子线程2开始---------")
        g_num=q.get()
        print("g_num is %d!!!!!" % g_num)
        print("-------子线程2结束---------")
    #g_num = 100  # 定义一个全局变量
    if __name__ == "__main__":
        q=Queue()
        print("----------主线程开始-------------")
        t1 = Thread(target=plus)  # 实例化线程t1
        t2 = Thread(target=minus)  # 实例化线程t2
        t1.start()  # 开启线程t1
        t2.start()  # 开启线程t2
        t1.join()  # 等待t1线程结束
        t2.join()  # 等待t2线程结束
        print("--------主线程结束-------------")

    运行结果:

    https://img1.sycdn.imooc.com//climg/646daaed098de12207040859.jpg


    祝学习愉快~

    2023-05-24 14:13:36
  • 懒惰的围脖 提问者 回复 好帮手慕小猿 #3
    谢谢耐心解答!
    2023-05-24 15:41:18
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师