首页 > 编程语言 >项目场景:python pyqt5 threading 多线程 数据混乱

项目场景:python pyqt5 threading 多线程 数据混乱

时间:2023-06-02 12:06:24浏览次数:37  
标签:python work pyqt5 queue item threads 线程 多线程 nloops


项目场景:python pyqt5 threading 多线程 数据混乱

根据配置文件多线程调用接口


# 问题描述:

参考http://www.starky.ltd/2019/09/23/pro-python-concurrency-with-multi-threading/

多线程调用接口,取得数据回调修改页面上的值发生混乱不准


项目场景:python pyqt5 threading 多线程 数据混乱_多线程


# 原因分析:

运行线程数量过多没有顺序


# 解决方案:

可以设置 线程独立对象 obj = threading.local() 直接在方法里 obj 存数据

修改之前

for i in job:
   t = threading.Thread(target=get, args=(i, call, nloops, parentWindows))
   threads.append(t)
   nloops = nloops + 1
nloops = range(nloops)
for i in nloops:
   time.sleep(2)
   threads[i].start()  # 开启线程

for i in nloops:  # 等待
   time.sleep(2)
   threads[i].join()  # 线程完成

修改之后

改成线程池,设定固定数量线程对象

THREAD_POOL_SIZE = 4

def worker(work_queue):
    while not work_queue.empty():
        try:
            item = work_queue.get(block=False)
        except Empty:
            break
        else:
            get(item["i"],item["call"],item["nloops"],item["parentWindows"],item["result"])
            work_queue.task_done()


def run_job(job=None, work_url=None, token=None, call=None, main_call_back=None, parentWindows= None):
    try:
        g.gz_arr = []

        work_queue = Queue()
        nloops = 0
        for i in job:

            work_queue.put({"i":i, "call":call, "nloops":nloops, "parentWindows":parentWindows, "result":""})
            nloops = nloops + 1



        threads = [
            threading.Thread(target=worker, args=(work_queue,)) for _ in range(THREAD_POOL_SIZE)
        ]

        for thread in threads:
            thread.start()

        work_queue.join()

        while threads:
            threads.pop().join()


标签:python,work,pyqt5,queue,item,threads,线程,多线程,nloops
From: https://blog.51cto.com/u_16015778/6401418

相关文章

  • python 使用 openpyxl 操作 excel
    python使用openpyxl操作excel文章目录python使用openpyxl操作excel前言1.环境2.读取数据3.openpyxl前言二、使用zipfile、openpyxl、flask批量导出excelzip1.环境openyxl:3.0.6python:3.7.6pandas:1.3.52.读取数据#使用pandas读取数据#https://pandas.pydata.org/docs......
  • python 中json数据可以以类似数组的方法访问 print(j["age"]["nian"])
    使用Python处理Json数据-猫坚果NutCat-博客园(cnblogs.com)JSON模组的常用方法load/loads:把JSON转换为Python#somejsonsomebody_info='{"name":"WenjieYe","age":75,"nationality":"China"}'#parse......
  • Python中字典取值常用的方法!
    字典是Python中比较常见的数据类型之一,它是一种可变容器模型,可以存储任意数量的任意类型的数据,而且字典中的每个元素由一个键和一个值组成,键和值之间用冒号分隔。本文为大家介绍一下Python中字典取值常用的方法,跟着学习一下吧。1、使用方括号[]运算符使用方括号[]运算......
  • python算法学习——第1天
    目录1、3,5,7的倍数判定2、鸡兔同笼3、计算有n个字符串中最长的字符串长度4、输出10个不重复的英文字母5、统计一段文字的单词个数并按字母顺序排序输出6、字典合并7、最大公约数&最小公倍数8、输出全排列9、输出<=n的全部回文数10、重复元素判定1、3,5,7的倍数判定num=int(inp......
  • python datetime 获取本月第一天 上月最后一天
    完整代码importdatetime(datetime.date.today().replace(day=1)-datetime.timedelta(days=1)).strftime("%Y-%m")获取本月第一天byyc=datetime.date.today().replace(day=1)获取上月最后一天syym=byyc-datetime.timedelta(days=1)获取上月月份sy=syym.strftime("%Y......
  • python操作InfluxDB
    InfluxDB版本:1.8.0以下针对1.x版本influxdb操作语法python针对influxdb的操作安装模块pipinstallinfluxdbfrominfluxdbimportinfluxDBClientconn_db=InfluxDBClient('localhost','8086','username','password','db_name')#1、显示已存在的......
  • asyncio:python3未来并发编程主流、充满野心的模块
    https://www.cnblogs.com/traditional/p/11828780.html楔子asyncio是Python在3.5版本中正式引入的标准库,这是Python未来并发编程的主流,非常重要的一个模块。有一个Web框架叫sanic,就是基于asyncio,使用sanic可以达到匹配Go语言的并发量(有点夸张了,还是有差距的,但......
  • python正则表达式之道
    Python使用正则表达式的步骤:1、导入正则表达式模块2、创建Regex对象re.compile(),传入正则表达式3、使用search()方法,传入字符串4、调用group()方法。举例:importre #1ne=re.compile(r'\d\d\d\-\d\d') #2mo=ne.search('yourdatasis456-11.') #3print(mo.gro......
  • 十二、python元组tuple
    十二、python元组tuple元组就相当于是只读的列表;因为只读,所以没有append,remove,修改等操作方法.它只有两个操作方法:count,index元组,字符串,列表都属于序列.所以元组也可以切片.1.元组的创建列表使用中括号,元组使用小括号。tuple1=(1,2,3,4,5,1,7)print(type(tuple1))......
  • 九、python循环语句
    九、python循环语句1.for循环for循环遍历一个对象(比如数据序列,字符串,列表,元组等),根据遍历的个数来确定循环次数。for循环可以看作为定循环,while循环可以看作为不定循环。for循环的基本格式for变量in数据:重复执行的代码foriin(1,2,3,4,5): #这里用小括号表示是......