程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(2)

python线程的几种创建方式

发布于2019-09-09 15:52     阅读(1344)     评论(0)     点赞(14)     收藏(3)


Python3 线程中常用的两个模块为:

  • _thread
  • threading(推荐使用)

    使用Thread类创建

import threading
from time import sleep,ctime

def sing():
    for i in range(3):
        print("正在唱歌...%d"%i)
        sleep(1)

def dance():
    for i in range(3):
        print("正在跳舞...%d"%i)
        sleep(1)

if __name__ == '__main__':
    print('---开始---:%s'%ctime())

    t1 = threading.Thread(target=sing)
    t2 = threading.Thread(target=dance)

    t1.start()
    t2.start()

    #sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?
    print('---结束---:%s'%ctime())
"""
输出结果:
---开始---:Sat Aug 24 08:44:21 2019
正在唱歌...0
正在跳舞...0---结束---:Sat Aug 24 08:44:21 2019
正在唱歌...1
正在跳舞...1
正在唱歌...2
正在跳舞...2
"""

说明:主线程会等待所有的子线程结束后才结束

使用Thread子类创建

为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子类class,只要继承threading.Thread就可以了,然后重写run方法。

import threading
import time

class MyThread(threading.Thread):
    def run(self):
        for i in range(3):
            time.sleep(1)
            msg = "I'm "+self.name+' @ '+str(i) #name属性中保存的是当前线程的名字
            print(msg)


if __name__ == '__main__':
    t = MyThread()
    t.start()
"""
输出结果:
I'm Thread-5 @ 0
I'm Thread-5 @ 1
I'm Thread-5 @ 2
"""

使用线程池ThreadPoolExecutor创建

from concurrent.futures import ThreadPoolExecutor
import time
import os


def sayhello(a):
    for i in range(10):
        time.sleep(1)
        print("hello: " + a)


def main():
    seed = ["a", "b", "c"]
    # 最大线程数为3,使用with可以自动关闭线程池,简化操作
    with ThreadPoolExecutor(3) as executor:
        for each in seed: 
            # map可以保证输出的顺序, submit输出的顺序是乱的
            executor.submit(sayhello, each)

    print("主线程结束")


if __name__ == '__main__':
    main()


所属网站分类: 技术文章 > 博客

作者:前方一片漆黑

链接:https://www.pythonheidong.com/blog/article/104614/5af6feb99de55d8fbb7e/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

14 0
收藏该文
已收藏

评论内容:(最多支持255个字符)