*并发通信*

进程通信隔离

进程间的隔离,可以看到在不同进程中,即使声明了全局变量,也还是没有作用

import multiprocessing

var = 10

def func():
    global var
    var += 1
    print('inner:', var)
    return var

p1 = multiprocessing.Process(target=func)
p1.start()
p1.join()

print('outer:', var)

进程信息共享
Manager是进程间通信的常用解决方案,通过公共空间来实现进程间的通信

import multiprocessing

mg = multiprocessing.Manager()  # 创建公共的服务器进程,并返回与其通信的肝理气


def fun(li):
    li.extend([1, 2, 3])


li_var = mg.list(('a', 'b', 'c'))  # 在进程中开辟一个列表(空间)

p1 = multiprocessing.Process(target=fun, args=(li_var,))
p1.start()
p1.join()

print(li_var)

线程信息共享
对于线程而言,它们始终在一个进程当中,因此共享同一个内存空间,因此可以访问主进程中的数据

import threading

var = 10


def func():
    global var
    var += 1
    print('inner:', var)
    return var


t1 = threading.Thread(target=func)
t1.start()
t1.join()

print('outer:', var)

线程之间资源抢占
这个时候出现资源错误,因为CPU计算是多条指令,组合运行的,所以在运行过程中如果插入其他指令,就会造成不可预见的结果

对于特殊资源,可以加上锁,来保护资源,确保每次操作的完整性

import threading

var = 10
lock = threading.Lock()  # 生成互斥锁


def f1():
    global var
    for i in range(1000000):
        lock.acquire()  #上锁
        var += 1
        lock.release()  #解锁
    return var


def f2():
    global var
    for i in range(1000000):
        lock.acquire()
        var -= 1
        lock.release()
    return var


t1 = threading.Thread(target=f1)
t2 = threading.Thread(target=f2)
t1.start()
t2.start()
t1.join()  # 确保子进程执行完毕才会执行下一个进程
t2.join()

print('outer:', var)

生产者和消费者模型-进程

import multiprocessing
import queue
import time


# 生产者
class Producer(multiprocessing.Process):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        # 生产者逻辑:只需要在队列中put问题
        import random
        while True:
            time.sleep(1)
            x = random.randint(1, 100)
            self.queue.put(x)
            print(f'生产者生产了数据{x}')

生产者和消费者模型-线程

import threading
import queue
import time


q = queue.Queue(4)  #生成一个队列

#生产者
class Producer(threading.Thread):
    def __init__(self,queue):
        super().__init__()
        self.queue = queue

    def run(self):
        # 生产者逻辑:只需要在队列中put问题
        import random
        while True:
            time.sleep(1)
            x = random.randint(1,100)
            self.queue.put(x)
            print(f'生产者生产了数据{x}')

#消费者
class Consumer(threading.Thread):

    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        # 消费者逻辑,只需要把队列中的问题get出来消费
        import random
        while True:
            time.sleep(1)

            data = self.queue.get()
            print(f'消费者消费了数据{data}')

pr = Producer(q)
cu = Consumer(q)
pr.start()
time.sleep(1)
cu.start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一逍倾城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值