zoukankan      html  css  js  c++  java
  • Python 高度定制化自己的线程类和进程类代码,获取启动进程或线程方法的结果(兼容Py2和Py3)

    #encoding=utf-8
    from threading import Thread
    from multiprocessing import Process
    import multiprocessing
    '''
    Author liuyancong
    '''
    
    class My_Job_With_Thread(Thread):
        def run(self):
            t_flag = True
            b = None
            try:
                b = self._Thread__target(*self._Thread__args, **self._Thread__kwargs)
            except AttributeError as e:
                b = self._target(*self._args, **self._kwargs)
                t_flag = False
            finally:
                if t_flag:
                    del self._Thread__target;del self._Thread__args;del self._Thread__kwargs
                else:
                    del self._target, self._args, self._kwargs
                # TODO 你可以在这做你想做的事情
                print(b)
    
    
    class My_Job_With_Process(Process):
        def run(self):
            res = None
            if self._target:
                res = self._target(*self._args, **self._kwargs)
            print (res)
            #TODO 你可以在这做你想做的事情
    
    
    def k(b):
        print('K方法开始执行')
        return b
    
    if __name__ == '__main__':
        My_Job_With_Process(target=k, args=('lyc_Process',)).start()
        My_Job_With_Thread(target=k,args=('lyc_Thread',)).start()
        print('end')

    1 、我们重写线程和进程类的run方法,首先是加上它们原来的代码,然后再执行自己的逻辑,保证自己传入的函数正常运行。

    因为py2 和py3的线程run方法不同所以这里做了异常捕获来对完成代码。

    py27下  Thread的run 方法如下(使用了类的私有属性 __属性名):所以我们通过   self._类名__属性名  来获取如

    def run(self):
            """Method representing the thread's activity.
    
            You may override this method in a subclass. The standard run() method
            invokes the callable object passed to the object's constructor as the
            target argument, if any, with sequential and keyword arguments taken
            from the args and kwargs arguments, respectively.
    
            """
            try:
                if self.__target: #在子类中使用 self._Thread__target来获取
    self.__target(*self.__args, **self.__kwargs) finally: # Avoid a refcycle if the thread is running a function with # an argument that has a member that points to the thread. del self.__target, self.__args, self.__kwargs

    而在py3中 Thread的run 方法如下:

    2 、因为Process类在Windows平台下只能运行在  

    if __name__ == '__main__': 下面
    所以我们在这里使用了这个,Thread就没有这个限制,其实可以在这样写
    My_Job_With_Thread(target=k,args=('lyc_Thread',)).start()
    if __name__ == '__main__':
        My_Job_With_Process(target=k, args=('lyc_Process',)).start()
        print('end')
    

    3、经过这样重写继承,我们就可以在自己启动的进程或者线程中去处理自己传入的函数的结果,这样可以满足一些比较奇葩的需求。



  • 相关阅读:
    js 判断图片是否加载完成
    js检测密码强度
    javascript 的MD5代码备份,跟java互通
    JavaScript实现限时抢购实例
    JS日期比较大小 给定时间和持续时间计算最终时间
    jquery与json的结合
    div内容过长自动省略号
    高并发大流量专题---11、Web服务器的负载均衡
    如何利用nginx实现负载均衡(总结)
    高并发大流量专题---10、MySQL数据库层的优化
  • 原文地址:https://www.cnblogs.com/lycsdhr/p/10555874.html
Copyright © 2011-2022 走看看