美文网首页
python的多线程类变量共享

python的多线程类变量共享

作者: Time一柒 | 来源:发表于2022-08-22 10:45 被阅读0次

问题说明

在同一个类中启动多线程的方法,和多线程执行的方法如果都在同一个类中,启动多线程时

  • 通过self调用方法名,多个线程之间类变量也是共享的,因为相当于在同一个空间下启动了多个不同函数,其他线程对某个类变量进行了修改,则其他线程会同步这个修改
  • 通过类名调用方法,相当于重新实例化了一个新的类,类变量不同线程之间不互通
  1. 通过self调用
import logging
import threading
import time


class LabelService:

    def create_thread(self, task_id, collection_name_list):
        """
        :param task_id: 任务id
        :param collection_name_list: 集合名称列表
        """
        # 多线程处理数据
        for collection_name in collection_name_list:
            # 创建线程
            thread_processing_data = threading.Thread(
                target=self.processing_data,
                args=(task_id, collection_name))
            thread_processing_data.name = task_id + "data_push_" + collection_name
            # 启动线程
            thread_processing_data.start()
            print("创建线程:[" + thread_processing_data.getName() + "]" + str(thread_processing_data.is_alive()))

    def processing_data(self, task_id, collection_name):
        self.task_id = task_id
        self.collection_name = collection_name
        print(self.task_id + self.collection_name)
        if collection_name == "a":
            time.sleep(10)
        print(self.task_id + self.collection_name)
LabelService().create_thread("qqqqqqqqqqqqqq", ["a", "b"])

输出:
qqqqqqqqqqqqqqa
qqqqqqqqqqqqqqb
qqqqqqqqqqqqqqb
qqqqqqqqqqqqqqb
  1. 通过类名调用
import threading
import time
class LabelService:

    def create_thread(self, task_id, collection_name_list):
        """
        :param task_id: 任务id
        :param collection_name_list: 集合名称列表
        """
        # 多线程处理数据
        for collection_name in collection_name_list:
            # 创建线程
            thread_processing_data = threading.Thread(
                target=LabelService().processing_data,
                args=(task_id, collection_name))
            thread_processing_data.name = task_id + "data_push_" + collection_name
            # 启动线程
            thread_processing_data.start()

    def processing_data(self, task_id, collection_name):
        self.task_id = task_id
        self.collection_name = collection_name
        print(self.task_id + self.collection_name)
        if collection_name == "a":
            time.sleep(10)
        print(self.task_id + self.collection_name)
LabelService().create_thread("qqqqqqqqqqqqqq", ["a", "b"])

输出:
qqqqqqqqqqqqqqa
qqqqqqqqqqqqqqb
qqqqqqqqqqqqqqb
qqqqqqqqqqqqqqa

相关文章

  • python的多线程类变量共享

    问题说明 在同一个类中启动多线程的方法,和多线程执行的方法如果都在同一个类中,启动多线程时 通过self调用方法名...

  • Python实例变量和类变量

    Python实例变量和类变量 类变量(类属性): 类变量属于类所有,所有实例共享一个变量 实例变量(实例属性) 实...

  • [Python系列]Python多线程

    背景:说到多线程,我们会想到的是:异步编程、同步(锁)、共享变量、线程池等等,那么Python里面多线程是如何实现...

  • 2018-02-14

    https://bop.mol.uno/ 已读 python 类变量与对象变量Class Variable 是共享...

  • Python 多进程之间共享变量

    Python 多线程之间共享变量很简单,直接定义全局 global 变量即可。而多进程之间是相互独立的执行单元,这...

  • python如何实现类似java的静态变量

    静态变量可以使得一个类的多个实例共享属性,也包括继承关系类的共享属性 而python没有静态变量,只有静态方法(即...

  • Java并发(7)——volatile

    volatile初步 volatile只能修饰在类中定义的变量,它可以保证多线程访问共享变量的可见性。由于线程在处...

  • python的调用类变量和实例变量、类方法和静态方法以及实例方法

    一、Python中的变量和方法分类 类变量:定义在class中且method外,为类和所有实例共享,包括publi...

  • python类共享变量详解

    问题: python类对象A,先实例化一个A对象的实例b,接着给A对象添加一个类共享变量xxx,再实例化一个c,请...

  • Python多线程(三):锁

    上一篇:多线程编程 在Python多线程(一):GIL中我们提到了竞态条件问题,即不同线程修改相同的共享变量出现运...

网友评论

      本文标题:python的多线程类变量共享

      本文链接:https://www.haomeiwen.com/subject/vxxggrtx.html