zhoushixiong

Python 线程同步

以下代码可以直观展示加锁和不加锁时,对数据修改情况。

加锁时

# -*-* encoding:UTF-8 -*-

# author : shoushixiong

# date : 2018/11/22

import threading

import time

list = [0,0,0,0,0,0,0,0,0,0,0,0]

class myThread(threading.Thread):

def __init__(self,threadId,name,counter):

threading.Thread.__init__(self)

self.threadId = threadId

self.name = name

self.counter = counter

def run(self):

print "开始线程:",self.name

# 获得锁,成功获得锁定后返回 True

# 可选的timeout参数不填时将一直阻塞直到获得锁定

# 否则超时后将返回 False

threadLock.acquire()

print_time(self.name,self.counter,list.__len__())

# 释放锁

threadLock.release()

def __del__(self):

print self.name,"线程结束!"

def print_time(threadName,delay,counter):

while counter:

time.sleep(delay)

list[counter-1] += 1

print "[%s] %s 修改第 %d 个值,修改后值为:%d" % (time.ctime(time.time()),threadName,counter,list[counter-1])

counter -= 1

threadLock = threading.Lock()

threads = []

# 创建新线程

thread1 = myThread(1,"Thread-1",1)

thread2 = myThread(2,"Thread-2",2)

# 开启新线程

thread1.start()

thread2.start()

# 添加线程到线程列表

threads.append(thread1)

threads.append(thread2)

# 等待所有线程完成

for t in threads:

t.join()

print "主进程结束!"

输出结果为:

开始线程: Thread-1

开始线程: Thread-2

[Thu Nov 22 16:04:13 2018] Thread-1 修改第 12 个值,修改后值为:1

[Thu Nov 22 16:04:14 2018] Thread-1 修改第 11 个值,修改后值为:1

[Thu Nov 22 16:04:15 2018] Thread-1 修改第 10 个值,修改后值为:1

[Thu Nov 22 16:04:16 2018] Thread-1 修改第 9 个值,修改后值为:1

[Thu Nov 22 16:04:17 2018] Thread-1 修改第 8 个值,修改后值为:1

[Thu Nov 22 16:04:18 2018] Thread-1 修改第 7 个值,修改后值为:1

[Thu Nov 22 16:04:19 2018] Thread-1 修改第 6 个值,修改后值为:1

[Thu Nov 22 16:04:20 2018] Thread-1 修改第 5 个值,修改后值为:1

[Thu Nov 22 16:04:21 2018] Thread-1 修改第 4 个值,修改后值为:1

[Thu Nov 22 16:04:22 2018] Thread-1 修改第 3 个值,修改后值为:1

[Thu Nov 22 16:04:23 2018] Thread-1 修改第 2 个值,修改后值为:1

[Thu Nov 22 16:04:24 2018] Thread-1 修改第 1 个值,修改后值为:1

[Thu Nov 22 16:04:26 2018] Thread-2 修改第 12 个值,修改后值为:2

[Thu Nov 22 16:04:28 2018] Thread-2 修改第 11 个值,修改后值为:2

[Thu Nov 22 16:04:30 2018] Thread-2 修改第 10 个值,修改后值为:2

[Thu Nov 22 16:04:32 2018] Thread-2 修改第 9 个值,修改后值为:2

[Thu Nov 22 16:04:34 2018] Thread-2 修改第 8 个值,修改后值为:2

[Thu Nov 22 16:04:36 2018] Thread-2 修改第 7 个值,修改后值为:2

[Thu Nov 22 16:04:38 2018] Thread-2 修改第 6 个值,修改后值为:2

[Thu Nov 22 16:04:40 2018] Thread-2 修改第 5 个值,修改后值为:2

[Thu Nov 22 16:04:42 2018] Thread-2 修改第 4 个值,修改后值为:2

[Thu Nov 22 16:04:44 2018] Thread-2 修改第 3 个值,修改后值为:2

[Thu Nov 22 16:04:46 2018] Thread-2 修改第 2 个值,修改后值为:2

[Thu Nov 22 16:04:48 2018] Thread-2 修改第 1 个值,修改后值为:2

主进程结束!

Thread-1 线程结束!

Thread-2 线程结束!

不加锁时同样是上面实例的代码,注释以下两行代码:

threadLock.acquire()

threadLock.release()

输出结果为:

开始线程: Thread-1

开始线程: Thread-2

[Thu Nov 22 16:09:20 2018] Thread-1 修改第 12 个值,修改后值为:1

[Thu Nov 22 16:09:21 2018] Thread-2 修改第 12 个值,修改后值为:2

[Thu Nov 22 16:09:21 2018] Thread-1 修改第 11 个值,修改后值为:1

[Thu Nov 22 16:09:22 2018] Thread-1 修改第 10 个值,修改后值为:1

[Thu Nov 22 16:09:23 2018] Thread-1 修改第 9 个值,修改后值为:1

[Thu Nov 22 16:09:23 2018] Thread-2 修改第 11 个值,修改后值为:2

[Thu Nov 22 16:09:24 2018] Thread-1 修改第 8 个值,修改后值为:1

[Thu Nov 22 16:09:25 2018] Thread-2 修改第 10 个值,修改后值为:2

[Thu Nov 22 16:09:25 2018] Thread-1 修改第 7 个值,修改后值为:1

[Thu Nov 22 16:09:26 2018] Thread-1 修改第 6 个值,修改后值为:1

[Thu Nov 22 16:09:27 2018] Thread-2 修改第 9 个值,修改后值为:2

[Thu Nov 22 16:09:27 2018] Thread-1 修改第 5 个值,修改后值为:1

[Thu Nov 22 16:09:28 2018] Thread-1 修改第 4 个值,修改后值为:1

[Thu Nov 22 16:09:29 2018] Thread-2 修改第 8 个值,修改后值为:2

[Thu Nov 22 16:09:29 2018] Thread-1 修改第 3 个值,修改后值为:1

[Thu Nov 22 16:09:30 2018] Thread-1 修改第 2 个值,修改后值为:1

[Thu Nov 22 16:09:31 2018] Thread-2 修改第 7 个值,修改后值为:2

[Thu Nov 22 16:09:31 2018] Thread-1 修改第 1 个值,修改后值为:1

[Thu Nov 22 16:09:33 2018] Thread-2 修改第 6 个值,修改后值为:2

[Thu Nov 22 16:09:35 2018] Thread-2 修改第 5 个值,修改后值为:2

[Thu Nov 22 16:09:37 2018] Thread-2 修改第 4 个值,修改后值为:2

[Thu Nov 22 16:09:39 2018] Thread-2 修改第 3 个值,修改后值为:2

[Thu Nov 22 16:09:41 2018] Thread-2 修改第 2 个值,修改后值为:2

[Thu Nov 22 16:09:43 2018] Thread-2 修改第 1 个值,修改后值为:2

主进程结束!

Thread-1 线程结束!

Thread-2 线程结束!

python 线程同步_Python 线程同步相关推荐

  1. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

  2. python线程状态_Python线程

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  3. python 线程退出_python线程退出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如果某线程并未使用很多 io 操作, 它会在自己的时间片内一直占用处理器(和 g ...

  4. python线程状态_python 线程的五个状态

    当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程. 那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建.就绪.运行.阻塞和 ...

  5. python 判断线程状态_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

  6. python结束线程类_Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  7. python 获取子线程状态_python线程状态

    python怎么判断线程的状态 python中如何在父线程中检测其子线程是否处于运行状态 子线程有一个方法 is_alive() 运行时会返回Bool值True python 在线程函数中如何实现线程 ...

  8. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  9. python 线程池_Python线程池及其原理和使用(超级详细)

    系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 线程池在系统启动时即 ...

最新文章

  1. Python是一门杰出的语言,值得你去学习
  2. [BZOJ 2839]集合计数
  3. Android之解决开启热点后跳转页面不稳定问题
  4. python用户登录(输入用户名和密码)dic_Python使用装饰器模拟用户登陆验证功能示例...
  5. go语言 goquery爬虫
  6. 子网掩码(subnet mask)与默认网关(default gateway)
  7. Linux操作系统基础
  8. js国内普通车牌正则验证
  9. DPDK Release 20.08
  10. java 重载的特征_Java中方法的重载详解
  11. MP3音频文件转换成caf格式
  12. 笔记 || css字体word字体大小对照表
  13. 八个机器学习非常重要的应用领域,每个领域都影响着我们的生活
  14. 【算法入坑】(一)双指针yyds,学完双指针刷题贼爽嘞
  15. echarts设置图标图例legend为圆,长方形,扇形等
  16. Webpack 4教程 - 第四部分,使用SplitChunksPlugin分离代码
  17. 99. Recover Binary Search Tree(恢复二叉搜索树)
  18. 【ESP32_8266_WiFi (十二)】ESP8266客户端HTTP API应用实例
  19. Web3云科普丨初识Web3云,先从这10个行业名词入手
  20. 百度开发平台api有哪些

热门文章

  1. 如何定制化SAP Spartacus的页面路由Route
  2. SAP UI5 OData API binding.filter(filter) 会触发发往后台的 OData 请求
  3. java数据跑不出来,6000条数据,java下跑了20多分钟了还没跑完,求教怎么改进
  4. python文件编译_将c程序编译为python扩展,生成.whl文件
  5. mysql mask from v2_MySQLDMB监控备份系统更新至v2.2
  6. 计算面平均边_计算机图形学补充2:齐次空间裁剪(Homogeneous Space Clipping)
  7. gin框架长连接_一个TCP长连接设备管理后台工程(一)
  8. java system.in 输入不回显_Java安全之URLDNS链
  9. java工程师_Java开发工程师需要掌握哪些技能?
  10. floyed java_Floyd算法java实现demo