Pythonは高速で美しい[v1.0.0] [マルチスレッド]

Pythonはマルチスレッドをサポートするために_threadとスレッドの2つのモジュールを提供しますが、_threadは低レベルの元の郡サポートと単純なロックを提供します。通常、マルチスレッドプログラミングには後者を使用します

複数のスレッドを作成する

スレッドモジュールを使用してスレッドを作成する方法は2つあります。1つはThreadクラスのコンストラクターを呼び出して作成する方法、もう1つはThreadクラスを継承してスレッドクラスを作成する方法です。

Threadクラスコンストラクターを使用してスレッドを作成する

Threadクラスには次のコンストラクターがあり、これを呼び出すことで直接作成できます
__init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None)

group:スレッドが属するスレッドグループを指定します
target:このスレッドによってスケジュールされるターゲットメソッドを
指定しますargs:タプルを指定し、位置パラメーターの形式でターゲットによって指定された関数のパラメーター
kwargs を渡します:辞書を指定し、キーワード引数を使用しますターゲットの形式で指定された関数はパラメーター
デーモンに渡されます:構築されたスレッドがバックグラウンドスレッドであるかどうかを指定します

コンストラクターを使用してスレッドステップを作成する

  • 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,)このパラメータは、タプル形式のパラメータであり、位置に応じて1つずつ関数実行本体に渡されます。この例では、アクション(MAX)関数です。

スレッドクラスを継承してスレッドクラスを作成する

Threadクラスを継承してスレッドステップを作成する

  • Threadクラスのサブクラスを定義し、このクラスのrun()関数を書き換えます。run()関数はスレッド実行本体です
  • スレッドサブクラスのインスタンスを作成します。これは、スレッドオブジェクトを作成します。
  • スレッドオブジェクトの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() # 等待线程终止

マルチスレッドブラウザインスタンス1

シングルスレッドコード

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

マルチスレッド起動ブラウザ2

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

214元記事公開 ウォンの賞賛183 ビューに10万+を

おすすめ

転載: blog.csdn.net/dawei_yang000000/article/details/105609689