基于_tkinter模块的comments in the source code,看起来tkinter实际上至少是为了使线程安全,只要Tcl是用enable-threads选项构建的。这是由Python跟踪器(issue11077)上的一个已解决的错误所支持的,它指出tkinter不是线程安全的,最终确定与tkinter有关的所有线程安全问题都是在python2.7.3+中修复的bug

以下是_tkinter模块的消息来源对此问题的看法:The Tcl interpreter is only valid in the thread that created it, and all Tk activity must happen in this thread, also. That means that the mainloop must be invoked in the thread that created the interpreter. Invoking commands from other threads is possible; _tkinter will queue an event for the interpreter thread, which will then execute the command and pass back the result. If the main thread is not in the mainloop, and invoking commands causes an exception; if the main loop is running but not processing events, the command invocation will block.

因此,只要主循环在应用程序的主线程中处于活动状态,tkinter就会自动安排方法在主线程中运行,这将使它成为线程安全的。也就是说,除了实际的Tkinter源代码和上面的bug报告之外,互联网上的大多数源代码都表明使用Tkinter线程会导致崩溃。我不太确定该相信什么,尽管在一些小例子中,从线程更新GUI效果很好。在

现在,您特别想知道与Tk小部件相关的线程安全规则是否也适用于Variable子类。确实如此:以下是Variable的一些实现,IntVar的父元素:class Variable:

_default = ""

_tk = None

def __init__(self, master=None, value=None, name=None):

"""Construct a variable

MASTER can be given as master widget.

VALUE is an optional value (defaults to "")

NAME is an optional Tcl name (defaults to PY_VARnum).

If NAME matches an existing variable and VALUE is omitted

then the existing value is retained.

"""

# ...snip...

if not master:

master = _default_root

self._master = master

self._tk = master.tk

def set(self, value):

"""Set the variable to VALUE."""

return self._tk.globalsetvar(self._name, value)

当您set一个变量时,它调用与Variable关联的主小部件上的globalsetvar方法。_tk.globalsetvar方法is implemented in C,并内部调用var_invoke,后者内部调用WaitForMainLoop,后者将尝试调度在主线程中执行的命令,如上面我所包含的_tkinter源中的引用所述。在

^{pr2}$

请注意,此代码路径也用于get操作,因此set和{}操作都由相同的规则管理。在

python中intvar_在Python线程中使用Intvar/DoubleVar是否安全?相关推荐

  1. Python并发编程之谈谈线程中的“锁机制”(三)

    大家好,并发编程 进入第三篇. 今天我们来讲讲,线程里的锁机制. 本文目录 何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL( ...

  2. lambd 创建线程_连接到Qt信号的Python lambda函数在其他线程中创建时不运行

    好吧,我弄清楚了发生了什么的一些细节.这仍然是一个部分的答案,但我认为它更适合作为一个答案,而不是更新问题.在 我最初的问题似乎是正确的,即slot链接到它们的实例对象的QObject事件循环(thr ...

  3. java线程中等待_Java:线程中的Thread.sleep():没有等待

    线程没有睡觉我有问题. 我不能把我的整个代码放在这里.所以,为了重现,这里是一个等待5秒的基本代码. try { int millisec = 5000; System.out.println(new ...

  4. QT中主线程终止子线程中的死循环

    终止子线程循环 一,原因 二,解决方法 一,原因 子线程中存在死循环,在主线程退出后,子线程还在继续运行,无法起到杀死线程的作用,造成后台存在多个相同功能进程,占用资源. 二,解决方法 发送SengM ...

  5. C#多线程开发-处理子线程中的异常

    C#多线程开发-处理子线程中的异常 在平时的多线程开发中,对于异常的处理是至关重要的,千万不能马虎.如果在实际的项目中,对于某些线程中的异常没有处理,会直接导致整个程序崩溃,软件无法使用. 其中需要说 ...

  6. android 线程 界面,android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...

  7. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  8. Android--Handler的使用方法:在子线程中更新界面

    版权声明:本文为博主原创文章,转载请标明出处. https://blog.csdn.net/chaoyu168/article/details/50914021 本文主要介绍Android的Handl ...

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

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

最新文章

  1. sqlite数值长度超过7位出错_数值计算方法 第一章 绪论
  2. 解决AJAX CalendarExtender控件不显示中文的情况(转帖博客园某人(不好意思,实在是没有找到您的尊姓大名,感谢一下!))...
  3. vmware workstation pro 14 虚拟机无法开启、黑屏的解决方案汇总
  4. linux查看redis索引,linux的redis操作命令
  5. Initial load DNL_CUST_PROD0 并找出SAP S4表和CRM表的mapping关系
  6. 关于H3 BPM数据库如何实现排序取数据的问题
  7. ttl是什么意思啊_解读:单反和微单的区别是什么?摄影新手应该如何选择?
  8. 4.3 深层网络中的前向传播
  9. 2.7_single_link_list_单链表
  10. 如何配置YUM本地更新源
  11. 55欧式空间02——标椎正交基、Schmidt 正交化、正交矩阵、欧氏空间的同构、QR分解
  12. LeetCode OJ - Longest Substring Without Repeating Characters
  13. 30岁软件测试转产品_补水抗皱紧致护肤产品盘点 护肤品排行榜前十名适合30-40岁...
  14. WWDC2019最值得看的十个视频
  15. GitHub上有不错的 C 开源项目?
  16. CSS系列之 box-sizing
  17. Linux配置http代理(原理)
  18. goldendict在线子典 goldendict
  19. 团队作业3 需求改进系统设计
  20. 计算机前程似锦教程图片,这三个专业非常学起很累,但毕业后前程似锦

热门文章

  1. 重磅!2020中国高校毕业生月薪排名:清华第1,共计24高校月薪过万
  2. 计算机界最大“追书坑”,82岁大神高德纳仍在写《计算机程序设计艺术》4B卷...
  3. Nginx源码分析:epoll事件处理模块概述
  4. CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3是什么呢?
  5. 详解 | SLAM回环检测问题
  6. 实战:基于OpenCV实现偏斜文档校正
  7. 服不服?40行Python代码,实现卷积特征可视化
  8. 一次搞定OpenCV源码及扩展模块的编译与环境配置
  9. C++字符串数组排序技巧
  10. Linux下基于密钥的安全验证实现方法