zoukankan      html  css  js  c++  java
  • Python如何创建多线程

    Python提供了_thread和threading两个模块来支持多线程,但_thread提供低级别的、原始的县城支持,以及一个简单的锁,通常情况下我们使用后者,来进行多线程编程

    创建多线程
    使用threading模块创建线程有两种方式,一种是调用Thread类的构造器来创建,另一种是继承Thread类创建线程类

    使用Thread类的构造器创建线程
    Thread类有如下构造器,直接调用它即可创建线程
    __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)

    group:指定该线程所属的线程组
    target:指定该线程要调度的目标方法
    args:指定一个元组,以位置参数的形式为target指定的函数传入参数
    kwargs:指定一个字典,以关键字参数的形式为target指定的函数传入参数
    daemon:指定所构建的线程是否是后台线程

    使用构造器创建线程步骤
    调用Thread类的构造器创建线程对象,其中target参数指定的函数作为线程执行体
    调用线程对象的start()方法启动该线程

    import threading
    
    # 定义一个普通的action函数,该函数准备作为线程执行体
    def action(max):
        for i in range(max):
            # 调用threading模块current_thread()函数获取当前线程
            # 线程对象的getName()方法获取当前线程的名字
            print(threading.current_thread().getName() +  " " + str(i))
    # 下面是主程序(也就是主线程的执行体)
    for i in range(100):
        # 调用threading模块current_thread()函数获取当前线程
        print(threading.current_thread().getName() +  " " + str(i))
        if i == 20:
            # 创建并启动第一个线程
            t1 =threading.Thread(target=action,args=(100,))
            t1.start()
            # 创建并启动第二个线程
            t2 =threading.Thread(target=action,args=(100,))
            t2.start()
    print('主线程执行完成!')

    args=(100,)可以看到这个参数,他是个元组形式的参数,按位置逐一传给函数执行体,在这个例子中就是action(MAX)函数

    继承Thread类创建线程类
    通过继承Thread类来创建线程步骤
    定义Thread类的子类,并重写该类的run()函数,run()函数是线程执行体
    创建Thread子类的实例,也就是创建线程对象
    调用线程对象的start()方法来启动线程
    ————————————————

    import threading
    
    # 通过继承threading.Thread类来创建线程类
    class FkThread(threading.Thread):
        def __init__(self):  
            threading.Thread.__init__(self)
            self.i = 0
        # 重写run()方法作为线程执行体
        def run(self):  
            while self.i < 100:
                # 调用threading模块current_thread()函数获取当前线程
                # 线程对象的getName()方法获取当前线程的名字
                print(threading.current_thread().getName() +  " " + str(self.i))
                self.i += 1
    # 下面是主程序(也就是主线程的执行体)
    for i in range(100):
        # 调用threading模块current_thread()函数获取当前线程
        print(threading.current_thread().getName() +  " " + str(i))
        if i == 20:
            # 创建并启动第一个线程
            ft1 = FkThread()
            ft1.start()
            # 创建并启动第二个线程
            ft2 = FkThread()
            ft2.start()
    print('主线程执行完成!')

    多线程调用接口

    # -*- coding: utf-8 -*-
    import threading
    import requests
    from time import ctime
    import json
    
    
    
    def syc_owen():
        """syc_owen"""
    
        print("Start synchronizing %s %s" % ("owen", ctime()))
        parameter = {"userId":"1263","userName":"13810078954","enterpriseId":"10330","flag":"sended"}
        request_own = requests.put("https://xxxxxx.leadscloud.com/mail/receiveSendedAndRubbishMail", data=parameter)
        data = request_own.json()
        print(json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False) )
        print("接口调用已经返回结果,本次同步结束")
    
    def syc_grace():
        """syc_grace"""
    
        print("Start synchronizing %s %s" % ("grace", ctime()))
        parameter = {"userId":"1294","userName":"13810327625","enterpriseId":"10330","flag":"sended"}
        request_own = requests.put("https://xxxxxx.leadscloud.com/mail/receiveSendedAndRubbishMail", data=parameter)
        data = request_own.json()
        print(json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False) )
        print("接口调用已经返回结果,本次同步结束")
    
    syc_email_threads = []  # 定义线程列表,然后逐一将线程放进列表最后加载线程列表执行
    owen_thread = threading.Thread(target=syc_owen)
    syc_email_threads.append(owen_thread)
    
    grace_thread = threading.Thread(target=syc_grace)
    syc_email_threads.append(grace_thread)
    
    
    if __name__ == '__main__':
        for threademail in syc_email_threads:
            threademail.start() # 启动线程活动
        for threademail in syc_email_threads:
            threademail.join() # 等待线程终止

    多线程启动浏览器实例 

    单线程代码

    # -*- coding: utf-8 -*-
    """
    Created on Wed Apr 24 11:45:55 2019
    
    @author: davieyang
    """
    from selenium import webdriver  # 引入webdriver
    from time import sleep  # 从time模块引入sleep 
    from time import ctime  # 从time模块引入ctime
    
    
    def start_chrome():  # 定义启动谷歌浏览器的方法
        print("starting chrome browser now! %s" % ctime())  # 控制台打印当前时间 
        chrome_driver = webdriver.Chrome()
        chrome_driver.get("http://www.baidu.com") #打开百度主页
        sleep(2)
        chrome_driver.quit()
    
    def start_firefox():  # 定义启动火狐浏览器的方法
        print("starting firefox browser now! %s" % ctime())  # 控制台打印当前时间
        fire_driver = webdriver.Firefox()
        fire_driver.get("http://www.baidu.com") #打开百度主页
        sleep(3)
        fire_driver.quit()
    
    def start_ie():  # 定义启动IE浏览器的方法
        print("starting ie browser now! %s" %ctime())  # 控制台打印当前时间
        ie_driver = webdriver.Ie()
        ie_driver.get("http://www.baidu.com")  #打开百度主页
        sleep(5)
        ie_driver.quit()
    
    if __name__ == '__main__':
        start_chrome()
        start_firefox()
        start_ie()
        print(u"全部结束 %s" %ctime())

    多线程代码

    # -*- coding: utf-8 -*-
    """
    Created on Wed Apr 24 19:23:25 2019
    @author: davieyang
    """
    
    from selenium import webdriver
    from time import sleep
    from time import ctime
    import threading
    
    
    def start_chrome():  # 定义启动谷歌浏览器的方法
        print("starting chrome browser now! %s" % ctime())
        chrome_driver = webdriver.Chrome()
        chrome_driver.get("http://www.baidu.com")
        sleep(2)
        chrome_driver.quit()
    
    
    def start_firefox():  # 定义启动火狐浏览器的方法
        print("starting firefox browser now! %s" % ctime())
        fire_driver = webdriver.Firefox()
        fire_driver.get("http://www.baidu.com")
        sleep(3)
        fire_driver.quit()
    
    
    def start_ie():  # 定义启动IE浏览器的方法
        print("starting ie browser now! %s" % ctime())
        ie_driver = webdriver.Ie()
        ie_driver.get("http://www.baidu.com")
        sleep(5)
        ie_driver.quit()
        
        
    threading_list = []  #创建一个空列表用于存储线程
    # 定义一个执行start_chrome()方法的线程
    chrome_thread = threading.Thread(target=start_chrome)
    threading_list.append(chrome_thread)  # 将线程放到列表中
    
    # 定义一个执行start_firefox()方法的线程
    firefox_thread = threading.Thread(target=start_firefox)
    threading_list.append(firefox_thread)  # 将线程放到列表中
    '''
    # 定义一个执行start_chrome()方法的线程
    ie_thread = threading.Thread(target=start_ie)  
    threading_list.append(ie_thread)  # 将线程放到列表中
    '''
    
    if __name__ == '__main__':
        for start_thread in threading_list:
            start_thread.start()
        for start_thread in threading_list:
            start_thread.join()
        print(u"全部结束 %s" % ctime())

    ————————————————
    版权声明:本文为CSDN博主「Davieyang.D.Y」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/dawei_yang000000/article/details/105609689

    你有什么心态,就有什么样的人生。管不好自己的心态,注定你就是个弱者。
  • 相关阅读:
    JS组件系列——自己动手扩展BootstrapTable的treegrid功能
    JS组件系列——自己动手封装bootstrap-treegrid组件
    JS组件系列——又一款MVVM组件:Vue(二:构建自己的Vue组件)
    使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
    使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
    C#组件系列——又一款日志组件:Elmah的学习和分享
    推荐一款带暂停功能的轮播组件,不要谢我,我叫红领巾!
    JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
    CSS系列——前端进阶之路:初涉Less
    MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
  • 原文地址:https://www.cnblogs.com/LQZ888/p/12745302.html
Copyright © 2011-2022 走看看