Python学习_任务10_多线程示例

多线程常见于任务并行的实现中,从感官上看有达到并行处理的效果,以下示例结合了一些多线程编程的技巧:

该示例看上去和常见的两个线程各自打印字符串的demo不太一样,那种实现主要想体现多进程的并发性的特征

本demo主要着重体现实用性

# - Tutorial 10
# - 2020-2-9
# - Johan
# - 题目:
#   1、多线程,两个任务并行执行
#   2、消息队列实现输入、计算和输出

"""
包含用法:
1、thread包,线程创建
2、队列、信号量
3、time包
4、全局变量
"""

import _thread
import time

# 消息队列,计数器,信号量
msg_queue = []
count = 0
sem = True   # 计算时不能输入,防止显示错位


# 输入任务
def task_input(task_name, task_id):
    global sem
    while 1:
        if sem:
            num = [0, 0]
            num[0] = int(input('请输入数字1:'))
            num[1] = int(input('请输入数字2:'))
            msg_queue.insert(0, num)
            time.sleep(0.3)


# 输出任务
def task_output(task_name, task_id):
    global count
    global sem
    while 1:
        if len(msg_queue) > 0:
            sem = False
            num = msg_queue.pop()
            func_calculate('%d' % count, num[0], num[1])
            count += 1
            sem = True
        time.sleep(0.1)


# 计算和显示处理
def func_calculate(serial, num1, num2):
    print('[Serial:%s] %d + %d = %d' % (serial, num1, num2, num1 + num2))


# Main部分
try:
    _thread.start_new_thread(task_input, ('InputTask', 1))
    _thread.start_new_thread(task_output, ('OutputTask', 2))
except Exception as e:
    print('Error occur: %s' % e)

while 1:
    pass

信号量的位置根据不同实现还有待斟酌,此处未显示混乱还得益于任务最后的time.sleep()

运行结果:

出于优化考虑你可能觉得这样写无非是复杂了加法功能的实现,弄了一些乱七八糟的东西在秀技术

其实如果出于技术敏感性你已经发现,这是一个简单的轮子,或者说用来理解RTOS程序的简单架构

如果我在输入任务中分为两个操作,一个操作只管输入数据,一个操作用于点击开始计算,就能实现计算任务队列,即批量计算

这种应对随机数据上报间隔、批量顺序保存数据,各司其职的程序结构,在要求实时的系统中比较常见

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值