Python多线程详解_python 可以使用几个线程(1)

如果加上join,并设置等待时间,就会等待线程一段时间再退出:

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
(
4
)

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
.
setDaemon
(
True
)

t
.
start
(
)

t
.
join
(
1
)

输出:

the
curent
threading  
MainThread
is

running

the
curent
threading  
Thread

1

is

running

the
curent
threading  
MainThread
is

ended

主线程等待
1秒,就自动结束,并杀死子线程。如果
join不加等待时间,
t
.
join
(
)
,就会一直等待,一直到子线程结束,输出如下:

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

|

3、线程锁和ThreadLocal

(1)线程锁

对于多线程来说,最大的特点就是线程之间可以共享数据,那么共享数据就会出现多线程同时更改一个变量,使用同样的资源,而出现死锁、数据错乱等情况。

假设有两个全局资源,a和b,有两个线程thread1,thread2. thread1占用a,想访问b,但此时thread2占用b,想访问a,两个线程都不释放此时拥有的资源,那么就会造成死锁。

对于该问题,出现了Lock。 当访问某个资源之前,用Lock.acquire()锁住资源,访问之后,用Lock.release()释放资源。

1

2

3

4

5

6

7

8

9

10

11

12

13

|

a

=

3

lock

=

threading
.
Lock
(
)

def
target
(
)
:

print

‘the curent threading  %s is running’

%

threading
.
current_thread
(
)
.
name

time
.
sleep
(
4
)

global

a

lock
.
acquire
(
)

try
:

a

+=

3

finally
:

lock
.
release
(
)

print

‘the curent threading  %s is ended’

%

threading
.
current_thread
(
)
.
name

print

‘yes’

|

用finally的目的是防止当前线程无线占用资源。

(2)ThreadLocal

介绍完线程锁,接下来出场的是ThreadLocal。当不想将变量共享给其他线程时,可以使用局部变量,但在函数中定义局部变量会使得在函数之间传递特别麻烦。ThreadLocal是非常牛逼的东西,它解决了全局变量需要枷锁,局部变量传递麻烦的两个问题。通过在线程中定义:
local_school = threading.local()
此时这个local_school就变成了一个全局变量,但这个全局变量只在该线程中为全局变量,对于其他线程来说是局部变量,别的线程不可更改。 def process_thread(name):# 绑定ThreadLocal的student: local_school.student = name

这个student属性只有本线程可以修改,别的线程不可以。代码:

1

2

3

4

5

6

7

8

9

10

11

|

local

=

threading
.
local
(
)

def
func
(
name
)
:

print

‘current thread:%s’

%

threading
.
currentThread
(
)
.
name

local
.
name

=

name

print

“%s in %s”

%

(
local
.
name
,
threading
.
currentThread
(
)
.
name
)

t1

=

threading
.
Thread
(
target

func
,
args

(
‘haibo’
,
)
)

t2

=

threading
.
Thread
(
target

func
,
args

(
‘lina’
,
)
)

t1
.
start
(
)

t2
.
start
(
)

t1
.
join
(
)

t2
.
join
(
)

|

从代码中也可以看到,可以将ThreadLocal理解成一个dict,可以绑定不同变量。
ThreadLocal用的最多的地方就是每一个线程处理一个HTTP请求,在Flask框架中利用的就是该原理,它使用的是基于Werkzeug的LocalStack。

4、Map实现多线程:

对于多线程的使用,我们经常是用thread来创建,比较繁琐:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

|

class

MyThread
(
threading
.
Thread
)
:

def
init
(
self
)
:

threading
.
Thread
.
init
(
self
)

def
run
(
self
)
:

lock
.
acquire
(
)

print
threading
.
currentThread
(
)
.
getName
(
)

lock
.
release
(
)

def
build_worker
(
num
)
:

workers

=

[
]

for

t

in

range
(
num
)
:

work

=

MyThread
(
)

work
.
start
(
)

workers
.
append
(
work
)

return

workers

def
producer
(
)
:

threads

=

build_worker
(
4
)

for

w

in

threads
:

w
.
join
(
)

print

‘Done’

|

如果要创建更多的线程,那就要一一加到里面,操作麻烦,代码可读性也变差。在Python中,可以使用map函数简化代码。map可以实现多任务的并发,简单示例:

1

2

|

urls

=

[
‘http://www.baidu.com’
,
‘http://www.sina.com’
,
‘http://www.qq.com’
]

results

map
(
urllib2
.
urlopen
,
urls
)

|

map将urls的每个元素当做参数分别传给urllib2.urlopen函数,并最后把结果放到results列表中,map 函数一手包办了序列操作、参数传递和结果保存等一系列的操作。 其原理:外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

map函数负责将线程分给不同的CPU。

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程。代码:

1

2

3

4

5

6

7

如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
c4513c1a906b72cbf93031e6781512b.png)

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值