美文网首页
二、并发通信

二、并发通信

作者: 梦捷者 | 来源:发表于2018-12-19 22:27 被阅读4次

(一)进程间的通信

1、进程间的内存资源是隔离的互不干扰的。(进程之间是相互独立的)    

2、进程之间通信的解决方案

import multiprocessing

a=1

def func():

        global a

         a=2

if __name__=='__main__':

        p=multiprocessing.Process(target=func)

         p.start()

          p.join()

           print(a)

3、Manager的基本使用(Manager相当于父进程在程序运行的时候会自动生成一个服务子进程,其作用相当于服务子进程中的保存公共数据的区域)

from multiprocessing import Process,Manager

def func(tu1):

        print('我是子进程,我现在要修改m_liast')

        tu1.append('a')

if __name__=='__main__':

        m_list=Manager().list()

         print('我是主进程中的m_list,我现在的值是%s'%m_plist)

        p=Process(target=func,args=(m_list,))

        p.start()

         p.join()#会造成阻塞

        print("我是父进程中的m_list,我现在的值是%s"%m_list)

(二)线程间的通信

1、线程和线程之间的内存区域是可以共享的,全局变量是公用的。

2、线程之间会争夺资源。

代码:a、线程间全局变量的共享

            from threading import Thread

                    a=1

              def fun():

                      print('我是子线程,我要修改全局变量a的值')

                        global a

                            a=2

                if __name__=='__main__':

                         print('我是主线程,a现在的值是%s'%a)

                        p=Thread(target=func)

                        p.start()

                         p.join()#会造成阻塞

                         print('我是主线程,变量a现在的值是%s'%a)

            b、线程间的资源争夺

                import threding

                  data=0

                   def add_1():

                            global data

                            for i in range(1000):

                                    data+=1

                    def add_2():

                            global data

                            for i in range(1000):

                                    data-=1

                    if  __name__='__main__':

                            p=Thread(target=func_1)

                              p1=Thread(target=func_1)

                              p.start()

                              p.join()

                              p1.satrt()

                               p1.join()

                                print(data)

3、互斥锁:控制资源访问

 from  threding  import Thread,Lock

import time

data=0

def add_1(lock):

            global data

            lock.acquire()

            for i in range(1000):

                    data+=1

            lock.release()

def add_2(lock):

                            global data

                             lock.acquire()

                            for i in range(1000):

                                    data-=1

                            lock.release()

if  __name__='__main__':

            lock=Lock()

            p=Thread(target=func_1,args=(lock,))

            p1=Thread(target=func_1,args=(lock,))

             p.start()

               p.join()

                p1.satrt()

                 p1.join()

                  time.sleep()

                 print(data)

(三)进程和线程的安全队列

   1、队列的基本概念:一个入口,一个出口,数据具有先进先出特点的数据结构。

    2、队列的常用方法

3、python的queue模块提供了同步的,线程安全的队列类。

(四)生产者和消费者模型(通过队列实现)

代码如下:

相关文章

  • 二、并发通信

    (一)进程间的通信 1、进程间的内存资源是隔离的互不干扰的。(进程之间是相互独立的) 2、进程之间通信的解决方案...

  • 并发通信

    多进程之间通信的限制 进程之间是独立的,互不干扰的内存空间。我们先看个例子 运行结果: 再看利用进程运行的例子: ...

  • 并发通信

    事实上,不管是什么平台,什么编程语言,不管在哪,并发都是一个大话题。并发编程的难度在于协调,而协调就要通过交流,从...

  • golang并发总结

    golang并发模型 go在语言层面提供了内置的并发支持 不要通过共享内存来通信,而应该通过通信来共享内存 并发与...

  • Java并发教程

    Java并发教程 Java并发概述Java并发环境设置Java并发主要操作Java并发性线程间通信Java并发同步...

  • java内存模型

    java内存模型基础 并发编程,两个关键问题:线程通信和线程同步通信机制:共享内存和消息传递 java并发采用共享...

  • go并发通信

    go并发编程时,请记住:“不要通过共享内存来通信,而应该通过通信来共享内存” channel是Go语言在语言级别提...

  • 深入理解Java内存模型 ch1基础

    1.并发编程模型的分类 并发编程的两个关键问题: 通信 同步 通信机制有两种: 共享内存 消息传递 同步:用于控制...

  • Go的Goroutine的使用

    并发 concurrency Goroutine 通过通信来共享内存,而不是通过共享内存来通信 Channel是G...

  • GO语言初级学习之代码案例12 (UDP通信)

    @(go语言 黑马)[GO语言] UDP通信 题目:编写UDP通信的并发服务器和客户端 知识点:UDP通信 逻辑思...

网友评论

      本文标题:二、并发通信

      本文链接:https://www.haomeiwen.com/subject/yaurkqtx.html