服务器之家

服务器之家 > 正文

python 实现多线程的三种方法总结

时间:2021-10-19 09:26     来源/作者:淋巴不想动

1._thread.start_new_thread(了解)


import threading

import time

import _thread

def job():

    print("这是一个需要执行的任务。。。。。")

    print("当前线程的个数:", threading.active_count() )

    print("当前线程的信息:", threading.current_thread())

    time.sleep(100)

if __name__ == "__main__":

    # 创建多线程时, 需要制定该线程执行的任务

    _thread.start_new_thread(job, ())

    _thread.start_new_thread(job, ())

    job()

2.threading.Thread


import threading

import time

def job():

    print("这是一个需要执行的任务。。。。。")

    print("当前线程的个数:", threading.active_count() )

    time.sleep(1)

    print("当前线程的信息:", threading.current_thread())

if __name__ == "__main__":

    # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名

    t1 = threading.Thread(target=job,name="job1")

    t2 = threading.Thread(target=job,name="job2")

    t1.start()

    t2.start()

    print(threading.active_count())

 print("程序执行结束.....")

输出:

这是一个需要执行的任务。。。。。

当前线程的个数: 3

这是一个需要执行的任务。。。。。

3

程序执行结束.....

当前线程的个数: 3

当前线程的信息: <Thread(job1, started 140416648140544)>

当前线程的信息: <Thread(job2, started 140416639747840)>

出现的问题: 主线程执行结束, 但是子线程还在运行。

join()方法可以等待所有的子线程执行结束之后, 再执行主线程。


import threading

import time

def job():

    print("这是一个需要执行的任务。。。。。")

    print("当前线程的个数:", threading.active_count() )

    print("当前线程的信息:", threading.current_thread())

 time.sleep(1)

if __name__ == "__main__":

    # 创建多线程时, 需要制定该线程执行的任务.name线程名字 target目标函数名

    t1 = threading.Thread(target=job,name="job1")

    t2 = threading.Thread(target=job,name="job2")

    t1.start()

    t2.start()

    print(threading.active_count())

    # 出现的问题: 主线程执行结束, 但是子线程还在运行。

    # 等待所有的子线程执行结束之后, 再执行主线程

    t1.join()

    t2.join()

    print("程序执行结束.....")

python 实现多线程的三种方法总结

之前写过一个简单爬虫的实验,现在希望获取十个ip的城市和国家

-不使用多线程


import time

from urllib.request import urlopen

# 记录时间的装饰器

def timeit(f):

    def wrapper(*args, **kwargs):

        start_time = time.time()

        res = f(*args, **kwargs)

        end_time = time.time()

        print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))

        return res

    return wrapper

def get_addr(ip):

    url = "http://ip-api.com/json/%s" % (ip)

    urlObj = urlopen(url)

    # 服务端返回的页面信息, 此处为字符串类型

    pageContent = urlObj.read().decode("utf-8")

    # 2. 处理Json数据

    import json

    # 解码: 将json数据格式解码为python可以识别的对象;

    dict_data = json.loads(pageContent)

    print("""

                        %s

    所在城市: %s

    所在国家: %s

    

    """ % (ip, dict_data["city"], dict_data["country"]))

@timeit

def main():

    ips = ["12.13.14.%s" % (i + 1) for i in range(10)]

    for ip in ips:

        get_addr(ip)

if __name__ == "__main__":

    main()

python 实现多线程的三种方法总结

时间需要138.91秒。

-使用多线程


import threading

import time

from urllib.request import urlopen

def timeit(f):

    def wrapper(*args, **kwargs):

        start_time = time.time()

        res = f(*args, **kwargs)

        end_time = time.time()

        print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))

        return res

    return wrapper

def get_addr(ip):

    url = "http://ip-api.com/json/%s" % (ip)

    urlObj = urlopen(url)

    # 服务端返回的页面信息, 此处为字符串类型

    pageContent = urlObj.read().decode("utf-8")

    # 2. 处理Json数据

    import json

    # 解码: 将json数据格式解码为python可以识别的对象;

    dict_data = json.loads(pageContent)

    print("""

                        %s

    所在城市: %s

    所在国家: %s

    

    """ % (ip, dict_data["city"], dict_data["country"]))

@timeit

def main():

    ips = ["12.13.14.%s" % (i + 1) for i in range(10)]

    threads = []

    for ip in ips:

        # 实例化10个对象,target=目标函数名,args=目标函数参数(元组格式)

        t = threading.Thread(target=get_addr, args=(ip, ))

        threads.append(t)

        t.start()

    

    # 等待所有子线程结束再运行主线程

    [thread.join() for thread in threads]

if __name__ == "__main__":

    main()

python 实现多线程的三种方法总结 python 实现多线程的三种方法总结

3.重写run方法

重写run方法, 实现多线程, 因为start方法执行时, 调用的是run方法;run方法里面编写的内容就是你要执行的任务;


import threading

import time

# 重写一个类,继承于threading.Thread

class MyThread(threading.Thread):

    def __init__(self, jobName):

        super(MyThread, self).__init__()

        self.jobName = jobName

    # 重写run方法, 实现多线程, 因为start方法执行时, 调用的是run方法;

    # run方法里面编写的内容就是你要执行的任务;

    def run(self):

        print("这是一个需要执行的任务%s。。。。。" %(self.jobName))

        print("当前线程的个数:", threading.active_count() )

        time.sleep(1)

        print("当前线程的信息:", threading.current_thread())

if __name__ == "__main__":

    t1 = MyThread("name1")

    t2 = MyThread("name2")

    t1.start()

    t2.start()

    t1.join()

    t2.join()

    print("程序执行结束.....")

重写run方法实现刚才爬虫多线程案例


import threading

import time

from urllib.request import urlopen

def timeit(f):

    def wrapper(*args, **kwargs):

        start_time = time.time()

        res = f(*args, **kwargs)

        end_time = time.time()

        print("%s函数运行时间:%.2f" % (f.__name__, end_time - start_time))

        return res

    return wrapper

class MyThread(threading.Thread):

    def __init__(self, ip):

        super(MyThread, self).__init__()

        self.ip = ip

    def run(self):

        url = "http://ip-api.com/json/%s" % (self.ip)

        urlObj = urlopen(url)

        # 服务端返回的页面信息, 此处为字符串类型

        pageContent = urlObj.read().decode("utf-8")

        # 2. 处理Json数据

        import json

        # 解码: 将json数据格式解码为python可以识别的对象;

        dict_data = json.loads(pageContent)

        print("""

                            %s

        所在城市: %s

        所在国家: %s

        

        """ % (self.ip, dict_data["city"], dict_data["country"]))

@timeit

def main():

    ips = ["12.13.14.%s" % (i + 1) for i in range(10)]

    threads = []

    for ip in ips:

        # 实例化自己重写的类

        t = MyThread(ip)

        threads.append(t)

        t.start()

    [thread.join() for thread in threads]

if __name__ == "__main__":

    main()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/weixin_43067754/article/details/86763905

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部