ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python的麻烦的多线程

2020-01-10 14:01:16  阅读:231  来源: 互联网

标签:Python self threading 线程 麻烦 time import 多线程 def


对于python的多线程,也就是threading模块,从开始学到现在,依旧觉得麻烦,对,依旧这么感觉。时隔已久,来整理一下。

 

 线程对象的方法:

 

  • Start() 开始线程的执行
  • Run() 定义线程的功能的函数
  • Join(timeout=None) 程序挂起,直到线程结束;如果给了timeout,则最多阻塞timeout秒
  • getName() 返回线程的名字
  • setName() 设置线程的名字
  • isAlive() 布尔标志,表示这个线程是否还在运行
  • isDaemon() 返回线程的daemon标志
  • setDaemon(daemonic) 把线程的daemon标志设为daemonic(一定要在start()函数前调用)
  • t.setDaemon(True) 把父线程设置为守护线程,当父进程结束时,子进程也结束。

 

threading类的方法:

 

  • threading.enumerate() 正在运行的线程数量

 

 两种创建多线程的方式

使用Thread()函数创建线程。

import threading
import time

# 多线程A
def fun(i):
    print(str(i) + "\t" + time.strftime('%X'))

for i in range(10):
    t = threading.Thread(target=fun, args=(i,))
    t.start()

另一种通过继承threading类的方式,重写了run函数:

import threading
import time

# 多线程B
class myThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        try:
            print("success input " + time.strftime('%X'))
        except:
            pass


for i in range(10):
    th = myThread()
    th.start()

for i in range(10):
    th.join()

多线程获取返回值

python的多线程本身没有获取返回值的函数,继承threading类,然后写一个获取返回值的函数get_result。

import threading
import time

# 多线程获取返回值
class myThread(threading.Thread):
    def __init__(self, func, args=()):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args

    def run(self):
        self.result = self.func(*self.args)

    def get_result(self):
        try:
            return self.result
        except Exception:
            pass


def fun():
    return time.strftime('%Y-%m-%d %X')

threads = []

for i in range(20):
    t = myThread(fun)
    t.start()
    threads.append(t)
    
for i in range(len(threads)):
    print(threads[i].get_result())
    threads[i].join()

控制并发线程数的两种方法

当执行任务特别多是,就需要控制并发线程数,threading类自带的方法。

import threading
import time

# 控制线程数A
thread_nums = 10

set_thread_nums = threading.BoundedSemaphore(thread_nums)

class myThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        set_thread_nums.acquire()
        try:
            a = 1
            print("The result is :{0} in {1}".format(a, time.strftime("%Y-%m-%d %X")))
            time.sleep(1)
        except:
            pass
        finally:
            set_thread_nums.release()
    

for i in range(20):
    t = myThread()
    t.start()

for i in range(20):
    t.join()

也可以自己编写。

import threading
import time

# 控制线程数B
threads = []

def fun():
    print(time.strftime("%Y-%m-%d %X"))
    time.sleep(1)

for i in range(10):
    t = threading.Thread(target=fun)
    threads.append(t)

for i in range(len(threads)):
    threads[i].start()
    while True:
        if len(threading.enumerate()) < 3:
            break

标签:Python,self,threading,线程,麻烦,time,import,多线程,def
来源: https://www.cnblogs.com/awrrays/p/12175799.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有