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. Nginx.conf参数配置详解

    Nginx的配置文件nginx.conf配置详解如下: user nginx nginx; #Nginx用户及组:用户 组.window下不指定 worker_processes 8; #工作进程:数 ...

  2. 眼见为实 — CSS的overflow属性

    1. overflow属性 CSS的overflow属性指定当内容溢出一个元素的框,会发生什么.举个栗子: <!DOCTYPE html> <html> <head> ...

  3. 5、Java 修饰符

    引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符. 1.访问控制修饰符的总结 四个关键字:public.protec ...

  4. [BZOJ4237]稻草人 题解

    我们考虑分治一下 按\(x\)坐标排序 然后对于每一段的两部分都按\(y\)排序 左右两边都维护一个单调栈 然后考虑右边对左边的贡献就行了 #include <bits/stdc++.h> ...

  5. 2020-06-02:千万级数据量的list找一个数据。

    福哥答案2020-06-02: 对于千万级长度的数组单值查找:序号小的,单线程占明显优势:序号大的,多线程占明显优势.单线程时间不稳定,多线程时间稳定. go语言测试代码如下: package mai ...

  6. C#LeetCode刷题-递归

    递归篇 # 题名 刷题 通过率 难度 687 最长同值路径   30.8% 简单 698 划分为k个相等的子集   30.7% 中等 726 原子的数量   37.2% 困难 761 特殊的二进制序列 ...

  7. MyBatis使用LocalDateTime遇到的一系列问题

    问题 在Mybaits中传入参数为LocalDateTime,查询发现结果集为空,插入时发现时间相差13小时 测试 新建工程,新建测试库(主要此处新工程使用的JDBC为mysql-connector- ...

  8. Android EditText判断输入的字符串是否为数字(包含小数点)

    有时候项目需要获取EditText所输入的字符串为纯数字(含小数),一般情况下在xml中设置EditText的的属性(我是直接设置digits为数字和小数点,即digits="0123456 ...

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

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

  10. @SuppressWarnings注解用法详解(转)

    原文连接https://blog.csdn.net/sysware_carol/article/details/52100580 今天来谈谈@SuppressWarnings注解的作用. J2SE 提 ...