在多线程中改进Python 3代码:函数中的多个线程

时间:2018-06-21 12:27:54

标签: python multithreading

我不是开发人员,但是这些年来,编程语言的基本知识变得非常有用。现在,我有一个小项目,必须从网站(php)读取数据(机器的m / min速度),将其计算为计数器,然后通过opc-ua将其呈现给服务器。我无法编辑该网站。

对于OPC-UA,我使用的是https://github.com/FreeOpcUa/python-opcua,在这里我根据需要修改了服务器示例。

我的Python脚本正在运行,但是我认为我的代码很脏,需要一些建议以使其“更好”。此外,将来会有更多价值,因此最好在此之前对其进行优化。

我正在使用线程来分离数据获取和“计算”

import threading
import time
import datetime
import sys

import socket
import requests

import json
import re
shared_webclient3 = ''

def web_client3():
 global shared_webclient3
 sHostAddress = webclient3_hostname
 sURL='http://'+ sHostAddress +'/s7plc_db.php?readAll'
 headers = {'content-type': 'application/x-www-form-urlencoded'} #setze header
 while True:
    r = requests.get(sURL, headers=headers, data="") #sende GET Request an php Schnittstelle
    resultstring = r.text[:1000]
    jsondata=json.loads(resultstring)
    shared_webclient3=jsondata
    time.sleep(60)

这是从GET请求获取的JSON数据:

{"Soll_L1":{"value":10,"quality":"GOOD"},"Ist_L1":{"value":11.112000465393,"quality":"GOOD"},"Soll_L2":{"value":15.10000038147,"quality":"GOOD"},"Ist_L2":{"value":14.08865737915,"quality":"GOOD"},"Soll_L3":{"value":11,"quality":"GOOD"},"Ist_L3":{"value":13.06134223938,"quality":"GOOD"},"Soll_L4":{"value":7.8000001907349,"quality":"GOOD"},"Ist_L4":{"value":0,"quality":"GOOD"},"L1_Zu_langsam":{"value":false,"quality":"GOOD"},"L1_Zu_schnell":{"value":false,"quality":"GOOD"},"L2_Zu_langsam":{"value":true,"quality":"GOOD"},"L2_Zu_schnell":{"value":false,"quality":"GOOD"},"L3_Zu_langsam":{"value":false,"quality":"GOOD"},"L3_Zu_schnell":{"value":false,"quality":"GOOD"},"L4_Zu_langsam":{"value":true,"quality":"GOOD"},"L4_Zu_schnell":{"value":false,"quality":"GOOD"}}

我得到4个数值:以米/分钟为单位的IST_L1至IST_L4,并以每米的刻度数进行计算。这是我使用一个值的方法:

def calculator():
 global shared_webclient3
 global shared_ticks1
 ts1 = 0
 ts2 = time.time()
 ticks = 0
 meter = 0
 while True:
    if shared_webclient3 != "":
        calcvalue=float(shared_webclient3['Ist_L1']['value'])
        usevalue= calcvalue / 60 #m / sec.
        ts1 = time.time()
        diff = ts1 - ts2
        meter = meter + (diff * usevalue)
        if meter >= 1:
            shared_ticks = shared_ticks +1
            meter = meter -1
        ts2 = time.time()
    time.sleep(1) 

对于每台机器来说,每刻度1米的“分辨率”就足够了,但是很容易在需要时使其变得更好。

这是我启动线程的方式:

web_client3 = threading.Thread(name='web_client3', target=web_client3, args=())
calculator = threading.Thread(name='calculator', target=calculator, args=())
web_client3.start()
calculator.start()

我想要的

我在这里写的主要意图是,我不想为每个值多次复制和粘贴计算器线程,而是希望有一个解决方案根据值的数量和某些选项/参数从一个函数启动多个线程。

我的待办事项:

  • 更好的变量名称,例如sJsonWebclient3
  • 评论供以后理解
  • 错误处理(我目前正在通知自己)

0 个答案:

没有答案