最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Python多线程中阻塞(join)与锁(Lock)使用误区解析

来源:动视网 责编:小OO 时间:2020-11-27 14:21:55
文档

Python多线程中阻塞(join)与锁(Lock)使用误区解析

事实上每次运行结果都不相同且不正确,这证明单核CPU+PIL仍无法保证线程安全,需要加锁。加锁后的正确代码。thread:%s';% i) for i in range(5)]for counter in counters: counter.start()time.sleep(5)print ';count=%s';% count。结果。count=500000。注意锁的全局性;这是一个简单的Python语法问题,但在逻辑复杂时有可能被忽略。要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁。以下为错误代码;
推荐度:
导读事实上每次运行结果都不相同且不正确,这证明单核CPU+PIL仍无法保证线程安全,需要加锁。加锁后的正确代码。thread:%s';% i) for i in range(5)]for counter in counters: counter.start()time.sleep(5)print ';count=%s';% count。结果。count=500000。注意锁的全局性;这是一个简单的Python语法问题,但在逻辑复杂时有可能被忽略。要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁。以下为错误代码;


事实上每次运行结果都不相同且不正确,这证明单核CPU+PIL仍无法保证线程安全,需要加锁.

加锁后的正确代码:

# -*- coding: utf-8 -*-
import threading
import time
count = 0
lock = threading.Lock()
class Counter(threading.Thread):
 def __init__(self, name):
 self.thread_name = name
 self.lock = threading.Lock()
 super(Counter, self).__init__(name=name)
 def run(self):
 global count
 global lock
 for i in xrange(100000):
 lock.acquire()
 count = count + 1
 lock.release()


counters = [Counter('thread:%s' % i) for i in range(5)]

for counter in counters:
 counter.start()

time.sleep(5)
print 'count=%s' % count

结果:

count=500000

注意锁的全局性

这是一个简单的Python语法问题,但在逻辑复杂时有可能被忽略.
要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁.

以下为错误代码

# -*- coding: utf-8 -*-

import threading
import time
count = 0
# lock = threading.Lock() # 正确的声明位置
class Counter(threading.Thread):
 def __init__(self, name):
 self.thread_name = name
 self.lock = threading.Lock() # 错误的声明位置
 super(Counter, self).__init__(name=name)
 def run(self):
 global count
 for i in xrange(100000):
 self.lock.acquire()
 count = count + 1
 self.lock.release()
counters = [Counter('thread:%s' % i) for i in range(5)]

for counter in counters:
 print counter.thread_name
 counter.start()

time.sleep(5)
print 'count=%s' % count

文档

Python多线程中阻塞(join)与锁(Lock)使用误区解析

事实上每次运行结果都不相同且不正确,这证明单核CPU+PIL仍无法保证线程安全,需要加锁。加锁后的正确代码。thread:%s';% i) for i in range(5)]for counter in counters: counter.start()time.sleep(5)print ';count=%s';% count。结果。count=500000。注意锁的全局性;这是一个简单的Python语法问题,但在逻辑复杂时有可能被忽略。要保证锁对于多个子线程来说是共用的,即不要在Thread的子类内部创建锁。以下为错误代码;
推荐度:
标签: 阻塞 python 线程
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top