二、并发通信

2018-12-19  本文已影响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模块提供了同步的,线程安全的队列类。

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

代码如下:

上一篇 下一篇

猜你喜欢

热点阅读