• python 线程,进程28原则


    基于函数实现

    from threading import Thread
    
    
    def fun(data, *args, **kwargs):
        """
    
        :param data:
        :param args:
        :param kwargs:
        :return:
        """
        print('start %s'%data)
    
    
    if __name__ == "__main__":
        tups = ((1,),(2,),(3,))
        for i in tups:
            kwargs = {
                "target": fun,
                'args':i
            }
            t = Thread(**kwargs)
            t.start()  

    基于类实现

    from threading import Thread
    from multiprocessing import Process
    
    
    class MyThread(Thread):
        def __init__(self, func,*args):
            super(MyThread,self).__init__()
            self.func = func
            self.args = args
    
        def run(self):
            self.func(*self.args)
    
    
    class MyProcess(Process):
        def __init__(self, func,*args):
            super(MyProcess, self).__init__()
            self.func = func
            self.args = args
    
        def run(self):
            self.func(*self.args)
    

      

    传入类的入口函数,即可实现多线程

    baidu = Baidu()
    sogou = Sogou()
    google = Google()
    
    baiduThread = MyThread(baidu.run,1,100)
    sogouThread = MyThread(sogou.run,1,100)
    googleThread = MyThread(google.run,1,100)
    # 线程开启
    baiduThread.start()
    sogouThread.start()
    googleThread.start()
    # 主线程等待子线程
    baiduThread.join()
    sogouThread.join()
    googleThread.join()
    

      

    总结一波,实际实现多进程的进程是类的实例化对象的run函数(baidu.run),因此在初始化类时是串行的,而很多模块并不能在同一进程中实例化多个对象。

    例如:

    class MyClass:
        def __init__(self):
            logging.basicConfig(filename='yaomaitong.log', filemode="w", level=logging.INFO) # 典型的反例
    
        def run(self,*args):
            # 所有需要多进程的程序都该写在这里
            self.start()
            self.continue()
            self.end()
            pass
        
        def start(self):
            pass
    ...
    

      

    线程池、进程池:

    from concurrent.futures import ThreadPoolExecutor
    from concurrent.futures import ProcessPoolExecutor
    
    import requests
    
    
    urls_list = [
        'https://www.baidu.com',
        'http://www.gaosiedu.com',
        'https://www.jd.com',
        'https://www.taobao.com',
        'https://news.baidu.com',
    ]
    pool = ThreadPoolExecutor(3)
    
    def request(url):
        response = requests.get(url)
        return response
    
    def read_data(future,*args,**kwargs):
        response = future.result()
        response.encoding = 'utf-8'
        print(response.status_code,response.url)
    
    def main():
        for url in urls_list:
            done = pool.submit(request,url)
            done.add_done_callback(read_data)
    
    if __name__ == '__main__':
        main()
        pool.shutdown(wait=True)
    

      

  • 相关阅读:
    linux virtualbox
    cboard安装
    test
    kafka安装
    OLAP解释
    php 连接数据库直接转成json格式
    hive学习
    mariadb修改密码
    mariadb anzhuang
    IDEA12 中写hql语句编译器莫名报错
  • 原文地址:https://www.cnblogs.com/zenan/p/9188521.html
Copyright © 2020-2023  润新知