码迷,mamicode.com
首页 > 编程语言 > 详细

三十五、python的线程

时间:2018-02-24 15:04:24      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:strong   star   程序   setname   运行   完成后   start   启动   大量   

python中,每个进程有GIL锁,导致每个进程同一时刻只能有一个线程出来执行

 

threading模块

import threading
import time
def foo(x):
    print("--------%s" %x)
    time.sleep(3)

t1=threading.Thread(target=foo,args=(2,))   #创建线程对象; 任务,参数,元组形式
t1.start()  # 启动

print("ending")

  

join

阻塞主线程,等待线程结束后再继续执行主线程

import threading
import time
def foo(x):
    print("--------%s" %x)
    time.sleep(3)

def bar(n):
    print("--------%s" %n)
    time.sleep(5)

s = time.time()

t1=threading.Thread(target=foo,args=(2,))   #创建线程对象; 任务,参数,元组形式
t1.start()  # 启动
t2=threading.Thread(target=bar,args=(5,))   #创建线程对象; 任务,参数,元组形式
t2.start()  # 启动

t1.join()
t2.join()

print("ending")
print(time.time() - s)

# --------2
# --------5
# ending
# 5.001526832580566

不开多线程的运行时间

import threading
import time
def foo(x):
    print("--------%s" %x)
    time.sleep(3)

def bar(n):
    print("--------%s" %n)
    time.sleep(5)

s = time.time()

foo(2)
bar(5)
print("ending")
print(time.time() - s)

# --------2
# --------5
# ending
# 8.000638246536255

 

setDaemon(True) 守护线程

  将线程声明为守护线程,必须在start()
  方法调用之前设置,如果不设置为守护线程程序会被无限挂起。
  当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程
  就分兵两路,分别运行,那么当主线程完成
  想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程
  完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以
  用setDaemon方法啦

  当daemon设置为true时,如果主线程退出,那么子线程也将跟着退出,反之,子线程将继续运行,直到正常退出
  

 

import threading
import time
def foo(x):

    time.sleep(3)
    print("--------%s" % x)

def bar(n):
    time.sleep(5)
    print("--------%s" % n)

s = time.time()

t1=threading.Thread(target=foo,args=(2,))   #创建线程对象; 任务,参数,元组形式
# t1.setDaemon(True)
t1.start()  # 启动
t2=threading.Thread(target=bar,args=(5,))   #创建线程对象; 任务,参数,元组形式
t2.setDaemon(True)
t2.start()  # 启动


print("ending")
print(time.time() - s)

# ending
# 0.0010097026824951172
# --------2

  

Thread实例对象的方法
  # isAlive(): 返回线程是否活动的。
  # getName(): 返回线程名。
  # setName(): 设置线程名。

threading模块提供的一些方法:
  # threading.currentThread(): 返回当前的线程变量。
  # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

  

==================

计算密集型和IO密集型

  IO密集:

    程序中存在大量的IO操作

  计算密集:

    程序中存在大量计算操作(非IO操作)

 

对于计算密集型,多线程还不如顺序执行;GIL锁只能出来一个线程,多个线程只能切换执行,这样对于计算密集型效率就会变低

对于IO密集型,对于IO阻塞时,切换执行其他线程,这样就节省了阻塞的时间,效率就会高

 

结论:对于python而言,同一进程下,无法利用多核优势,多线程处理IO密集型任务时,具有优势,对于处理计算密集型的任务,不推荐使用

 

三十五、python的线程

标签:strong   star   程序   setname   运行   完成后   start   启动   大量   

原文地址:https://www.cnblogs.com/Mr-chenshuai/p/8465426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!