1.线程间的通信方式

1.共享全局变量

2.线程队列(queue)

3.信号量(Semaphore)

2.共享全局变量进行通信

from threading import Thread
import time g_nums = [11,22,33] def work1(nums):
nums.append(44)
print("----in work1---",nums) def work2(nums):
#延时一会,保证t1线程中的事情做完
time.sleep(1)
print("----in work2---",nums) t1 = Thread(target=work1, args=(g_nums,))
t1.start()
t2 = Thread(target=work2, args=(g_nums,))
t2.start()

3.共享全局变量的资源竞争

# 多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确
import threading
import time g_num = 0 def work1(num):
global g_num
for i in range(num):
g_num += 1
print("----in work1, g_num is %d---" % g_num) def work2(num):
global g_num
for i in range(num):
g_num += 1
print("----in work2, g_num is %d---" % g_num) print("---线程创建之前g_num is %d---" % g_num) t1 = threading.Thread(target=work1, args=(1000000,))
t1.start()
t2 = threading.Thread(target=work2, args=(1000000,))
t2.start() while len(threading.enumerate()) != 1:
time.sleep(1) print("2个线程对同一个全局变量操作之后的最终结果是:%s" % g_num)

4.线程队列queue.Queue-生产者消费者模式

from threading import Thread
import queue
from time import sleep # 生产者
class Producer(Thread):
def run(self):
count = 0
while True:
if q.qsize() < 50:
for i in range(3):
count += 1
msg = "产品%d" % count # 将产品放入队列
q.put(msg)
# print("生产了: %s 还有%s个" % (msg, q.qsize()))
sleep(1) # 消费者
class Customer(Thread):
def run(self):
while True:
if q.qsize() > 20:
for i in range(2):
msg = q.get() # 从仓库中拿货
print("消耗了: %s 还有%s个" % (msg, q.qsize()))
sleep(1) def main():
# 创建一个队列仓库
global q
q = queue.Queue()
# 创建2个生产
for i in range(2):
p = Producer()
p.start()
# 创建3个消费
for i in range(3):
c = Customer()
c.start() if __name__ == "__main__":
main()
"""执行结果
消耗了: 产品1 还有20个
消耗了: 产品2 还有22个
消耗了: 产品3 还有24个
消耗了: 产品1 还有23个
消耗了: 产品2 还有25个
消耗了: 产品3 还有24个
消耗了: 产品4 还有23个
消耗了: 产品5 还有22个
"""

5.线程队列-先进先出队列,后进先出队列,优先级队列

from multiprocessing import Queue  # 是用于多进程的队列,就是专门用来做进程间通信(IPC)
import queue # 是用于同一进程内的队列,不能做多进程之间的通信 q = queue.Queue()
# 先进先出
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get()) q = queue.LifoQueue()
# 后进先出的队列
q.put(1)
q.put(2)
q.put(3)
print(q.get()) q = queue.PriorityQueue()
# 优先级队列,put()方法接收的是一个元组(),第一个位置是优先级,第二个位置是数据
# 优先级如果是数字,直接比较数值
# 如果是字符串,是按照 ASCII 码比较的,当ASCII码相同时,会按照先进先出的原则
q.put((1, 'abc'))
q.put((5, 'qwe'))
q.put((-5, 'zxc'))
print(q.get())
print(q.get())

6.信号量-Semaphore

from threading import Semaphore
from threading import Thread
import time def func(sem, i):
sem.acquire()
print('第%s个人进入屋子' % i)
time.sleep(2)
print('第%s个人离开屋子' % i)
sem.release() sem = Semaphore(5)
for i in range(20):
t = Thread(target=func, args=(sem, i))
t.start()

08_线程间通信 ITC的更多相关文章

  1. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  2. 线程间通信 GET POST

    线程间通信有三种方法:NSThread   GCD  NSOperation       进程:操作系统里面每一个app就是一个进程. 一个进程里面可以包含多个线程,并且我们每一个app里面有且仅有一 ...

  3. Java多线程编程核心技术---线程间通信(二)

    通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...

  4. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...

  5. volatile关键字与线程间通信

    >>Java内存模型 现在计算机普遍使用多处理器进行运算,并且为了解决计算机存储设备和处理器的运算速度之间巨大的差距,引入了高速缓存作为缓冲,缓存虽然能极大的提高性能,但是随之带来的缓存一 ...

  6. 06_Java多线程、线程间通信

    1. 线程的概念      1.1多进程与多线程 进程:一个正在执行的程序.每个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元. 一个进程至少有一个线程. 线程:就是进程中的一个独立 ...

  7. 【原】iOS多线程之线程间通信和线程互斥

    线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后 ...

  8. java多线程系列5-死锁与线程间通信

    这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两 ...

  9. Java笔记(二十)……线程间通信

    概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...

随机推荐

  1. RabbitMq之消息确认

    最近阅读了rabbitmq的官方文档,然后结合之前面试时被问到关于消息队列的问题来探索一下关于消息队列的消息确认机制. 其实消息确认就是消费者确认消息被消费了, 生产者确认消息已经发送到了消息队列中了 ...

  2. Django REST framework 单元测试

    Django REST framework 单元测试 只是简单记录一下测试代码怎么写 环境 Win10 Python3.7 Django2.2 项目 参照官网 快速开始 写了一个 demo 测试 参照 ...

  3. 关于Springboot配置文件的理解

    一.Springboot Springboot是用来简化Spring框架搭建和开发一款框架,可以理解为是一种Spring框架的简化版. 二.如何在IDEA里面初始化Springboot 主要可以分为两 ...

  4. java 多态一

    一 多态的概述 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学 生也是人,即出现两种形态. Java作为面向对象的语言,同样可以描述一个事物的多种形态.如Studen ...

  5. Git本地库既关联GitHub又关联Gitee

    创建代码仓库 使用gitee举例(github和gitee差不多) 1.在gitee右上角点击+,选择新建仓库

  6. 【Azure DevOps系列】什么是Azure DevOps

    DevOps DevOps是一种重视"软件开发人员(Dev)"和"IT运维技术人员(Ops)"之间沟通合作的文化,它促进开发和运营团队之间的协作,以自动化和可重 ...

  7. vue a标签下载图片文档显示下载失败

    解决:把所要下载的文件放到static文件下,具体原因-静态文件放在static内,否则webpack会打包.

  8. idea工程在maven projects中显示灰色的解决办法

    原文链接:https://blog.csdn.net/qq_30507287/article/details/83515461 在Mac上使用idea进行开发的过程中,一般在MavenProject中 ...

  9. docker简记

    title: docker学习简记 date: 2019-10-16 15:10:39 tags: docker Docker简记 1:Docker简介 1)出现背景 一款产品从开发到上线,从操作系统 ...

  10. JVM简记

    1.JVM概述 JVM(Java virtual Machine)指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现. JVM是一种规范,实现产品常 ...