Python快速而美丽[v1.0.0][多线程]

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())

多线程启动浏览器实例二

# -*- coding: utf-8 -*-

"""

Created on Wed Apr 24 20:19:59 2019


@author: davieyang

"""

from selenium import webdriver

from time import sleep

from time import ctime

import threading


def start_browser(browser, time):

    if browser == "chrome":

        print("starting chrome browser now! %s" % ctime())  # 控制台打印当前时间 

        chrome_driver = webdriver.Chrome()

        chrome_driver.get("http://www.baidu.com") #打开百度主页

        sleep(time)

        chrome_driver.quit()

    elif browser == "firefox":

        print("starting firefox browser now! %s" % ctime())  # 控制台打印当前时间

        fire_driver = webdriver.Firefox()

        fire_driver.get("http://www.baidu.com") #打开百度主页

        sleep(time)

        fire_driver.quit()

    else: 

        print("starting ie browser now! %s" %ctime())  # 控制台打印当前时间

        ie_driver = webdriver.Ie()

        ie_driver.get("http://www.baidu.com")  #打开百度主页

        sleep(time)

        ie_driver.quit()

browser_dict = {"chrome":3,"firefox":4,"ie":5}

start_browser_threading = []

for browser, time in browser_dict.items():

    threading_browser = threading.Thread(target = start_browser, args = (browser, time))

    start_browser_threading.append(threading_browser)


if __name__ == '__main__':

    for threading_browser in range(len(browser_dict)):

        start_browser_threading[threading_browser].start()

    for threading_browser in range(len(browser_dict)):

        start_browser_threading[threading_browser].join()

    print(u"全部结束 %s" %ctime())



点赞
收藏
回复
分享
举报
浏览294 发布于2020-04-21 06:26未知归属地
全部评论
最多点赞
最新发布
最早发布
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。