Python多线程

一、 多线程的理解

1. 线程

线程是进程的一部分,一个进程可以有多个线程

2. 多进程和多线程的区别

多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互相不影响,而在多线程中,所有的变量都由所有线程共享,所以任何一个变量都可以被任何一个线程修改。
由此也会带来一个弊端:多个线程同时改一个全局变量,可能导致内容的混乱。为了解决这个弊端,可以采用给关键代码(修改变量的部分的代码)加锁,这样保证在一个线程调用这一段代码的时候,别的线程无法调用这段代码。

3.线程锁

4. Python的GIL全局锁

二、Python中多线程的创建

1. 基本方法

在Python中实现多线程可以用两个模块,thread和threading。推荐使用更高级的threading模块。
可以参考这个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import threading
import time

def target():
print 'the curent threading %s is running' % threading.current_thread().name
time.sleep(1)
print 'the curent threading %s is ended' % threading.current_thread().name

print 'the curent threading %s is running' % threading.current_thread().name
t = threading.Thread(target=target)

t.start()
t.join()
print 'the curent threading %s is ended' % threading.current_thread().name

输出:
the curent threading MainThread is running
the curent threading Thread-1 is running
the curent threading Thread-1 is ended
the curent threading MainThread is ended

start是启动线程,join是阻塞当前线程的父线程,join能保证在t这个线程执行完毕之前父线程一直在阻塞状态,若不加join的话父线程不会等待子线程执行完毕才结束,但是Python中默认情况下父线程的退出不会强行杀死子线程。如果不加join输出如下:

1
2
3
4
the curent threading  MainThread is running
the curent threading Thread-1 is running
the curent threading MainThread is ended
the curent threading Thread-1 is ended

添加t.setDaemon(True)语句,则会在主线程结束之后杀死子线程。

如果不能理解的话可以看看这篇文章:关于python多线程编程中join()和setDaemon()的一点儿探究

2. 线程锁

3. 信号量Semaphore

semaphore是一个内置的计数器,每当调用acquire时,内置计数器-1,调用release时,内置计数器+1.

例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
import threading

s1=threading.Semaphore(5) #添加一个计数器

def foo():
s1.acquire() #计数器获得锁
time.sleep(2) #程序休眠2秒
print("ok",time.ctime())
s1.release() #计数器释放锁


for i in range(20):
t1=threading.Thread(target=foo,args=()) #创建线程
t1.start() #启动线程

参考链接:

  1. Python多线程详解
  2. 多线程-廖雪峰
0%