在python3多线程程序中正确管理用户的输入命令

时间:2018-08-09 12:05:12

标签: python while-loop thread-safety user-input python-multithreading

我有一个小问题,我一个人无法解决(因为我不太擅长多线程),这是我想做的事情: 我想做一个程序,每5秒执行一组预定义的任务,一个例程。但是用户必须有可能要求程序以最高优先级执行另一个任务(而不是例程),而不必关闭所有程序。 所以我想创建两个线程,一个用于管理任务(例行任务和用户定义的任务)

  1. 线程1 :从用户读取输入(预定义的命令)并在接收命令时设置任务列表。
  2. 线程2 :执行命令并管理数据库。

在下面的代码中,您将找到:

任务:用户要求执行的任务列表,由两个线程更新

数据:数据库,由线程2更新

looping _ * :两个变量,以了解循环是否应该继续进行

stop_all():停止两个线程。两个线程都使用它

thread1():读取输入并更新任务列表。

add_date() add_number():用于更新数据库的方法,仅由线程2使用。

routine():如果用户没有要求其他任务(如果列表任务为空),则是程序必须执行的默认任务集。 更新_

thread2():正在管理任务的执行顺序

这是代码:

import numpy as np
import datetime

import time

from threading import Thread


tasks = []
data = []


def stop_all():
    global looping_main
    global looping_add_tasks
    looping_main = False
    looping_add_tasks = False

#Thread 1 : CLI + tasks update
def thread1():
    global looping_add_tasks, tasks, data
    looping_add_tasks = True
    while looping_add_tasks:
        t = input('Enter a task : ')
        if t == "add_date":
            tasks.append(t)
        elif t == "add_number":
            tasks.append(t)
        elif t == "break":
            stop_all()
        elif t == "show_data":
            print(data)
        elif t == "show_tasks":
            print(tasks)
        else:
            print("last command : \"", t,  "\" not valid")
        time.sleep(0.2)
#Thread 2 : data + tasks update
def add_date():
    data.append(datetime.datetime.now())

def add_number():
    data.append(np.random.randint(0, 12))

def routine():
    #Executes actions on the data if there are no others tasks to do
    pass

def thread2():
    global looping_main, tasks, data
    looping_main = True
    while looping_main:
        if len(tasks) > 0:
            current_task = tasks[0]
            tasks = tasks[1::]
            if current_task == "add_date":
                add_date()
            elif current_task == "add_number":
                add_number()
            else:
                routine()
        if len(data) > 10:
            stop_all()
        time.sleep(0.2)




Thread(target = thread1).start()
Thread(target = thread2).start()

问题如下:

  • 这是正确的方法吗?
  • 我可以让该程序在服务器上运行数周而没有问题吗?
  • 我可以在输出中摆脱此行:“ >>>”(请参阅​​:)

    Enter a task : update_number
    >>> 
    Enter a task :
    

P.S。我认为我给这个问题起的名字是不合适的,因此,如果您有想法要更改它,我欢迎您提出建议。 感谢您的阅读。 编辑:对代码进行了细微更改

0 个答案:

没有答案