首页 > 代码库 > python线程

python线程

 

Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。

 

import threading

import time

  

def show(arg):

    time.sleep(1)

    print thread+str(arg)

  

for i in range(10):

    t = threading.Thread(target=show, args=(i,))

    t.start()


print main thread stop

上述代码中创建了10个线程,然后控制器就交给了CPU,CPU根据制定算法进行调度,分片执行指令。
更多方法:

  start:  线程准备就绪,等待CPU调度

  setName:为线程设置名称

  getName:获取线程名称

  setDaemon:设置为后台线程或前台线程(默认为前台线程)。如果为后台线程,主线程执行完毕后,后台线程不论成功与否,均停止。如果为前台线程,主线程执行完毕后,等待前台线程也执行完毕,程序停止。

  join  :当每个线程执行完毕后继续往下执行,该方法使得多线程变得无意义

  run  :线程被CPU调度后自动执行线程对象的run方法。

 

技术分享
import threading, time


def f1(arg,a):
    print(arg,a)
    time.sleep(2)
    print(老司机等等我)

f1(111, zxc)

for i in range(5):
    t = threading.Thread(target=f1, args=(123,qwe,))
    t.setDaemon(True)   #为True表示主线程不等待子线程,默认为False
    t.start()
t.join(2)    #表示主线程执行到此处时,等待子线程,参数为等待超时时间,可为空
print(老司机开车到站了‘)
示例

线程锁:

由于线程之间是进行随机调度,并且每个线程可能执行n条之后,当多个线程同事修改同一条数据时可能会出现脏数据,所以,出现了线程锁,即同一时刻允许一个线程执行操作。

技术分享
import threading, time

NUM = 10


def func(l):
    global NUM
    l.acquire()
    NUM -= 1
    time.sleep(2)
    print(NUM)
    l.release()
lock = threading.RLock()

for i in range(9):
    t = threading.Thread(target=func, args=(lock,))
    t.start()
普通锁

在上述代码中如果不使用线程锁,那么输出结果将全部是1.

 

信号量(Semaphore):

互斥锁同时只允许一个线程更改数据,而信号量同事允许一定数量的线程更改数据。

技术分享
NUM = 10


def func(i, l):
    global NUM
    l.acquire()
    NUM -= 1
    #time.sleep(2)
    print(i, NUM)
    l.release()
lock = threading.BoundedSemaphore(5)    #最多允许5个线程同时运行

for i in range(30):
    t = threading.Thread(target=func, args=(i,lock,))
    t.start()
信号量

 

事件(event):

python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法:set、wait、clear。事件处理的机制:全局定义了一个flag,如果flag为False,那么执行程序执行event.wait方法时就会阻塞,如果flag值为True,那么event.wait方法就不阻塞。

技术分享
def func(i, e):
    print(i)
    e.wait()         #检测event是什么状态,如果是clear状态则在此等待
    print(i+100)

event = threading.Event()

for i in range(30):
    t = threading.Thread(target=func, args=(i, event,))
    t.start()

event.clear()       #表示锁住线程
inp = input(">>:")
if inp:
    event.set()     #表示解锁线程
事件


条件(Condition)

使得线程等待,只有满足条件时,才释放n个线程

技术分享
def func(i, con):
    print(i)
    con.acquire()
    con.wait()
    print(i+10)
    con.release()

c = threading.Condition()

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

while True:
    inp = input(>>:)
    if inp == q:break
    c.acquire()
    c.notify(int(inp))
    c.release()
条件
技术分享
def condition():
    ret = False
    inp = input(>>:)
    if inp:ret = True
    return ret


def func(i, con):
    print(i)
    con.acquire()
    con.wait_for(condition)
    print(i+100)
    con.release()

c = threading.Condition()
for i in range(10):
    t = threading.Thread(target=func, args=(i, c,))
    t.start()
条件2

 

Timer:

定时器,指定n秒后执行某操作

技术分享
from threading import Timer

def hello():
    print(hello)

t = Timer(1, hello)
t.start()
Timer

 

python线程