Python 线程同步
多个执行线程经常要共享数据,如果仅仅读取共享数据还好,但是如果多个线程要修改共享数据的话就可能出现无法预料的结果。
假如两个线程对象t1
和t2
都要对数值num=0
进行增1运算,那么t1
和t2
都各对num
修改10
次的话,那么num
最终的结果应该为20
。但是如果当t1
取得num
的值时(假如此时num
为0
),系统把t1
调度为“sleeping
”状态,而此时t2
转换为“running
”状态,此时t2
获得的num
的值也为0
,然后他把num+1
的值1
赋给num
。系统又把t2
转化为“sleeping
”状态,t1
为“running
”状态,由于t1
已经得到num
值为0
,所以他也把num+1
的值赋给了num
为1
。本来是2
次增1
运行,结果却是num
只增了1
次。类似这样的情况在多线程同时执行的时候是有可能发生的。所以为了防止这类情况的出现就要使用线程同步机制。
最简单的同步机制就是“锁”
锁对象用threading.RLock
类创建
mylock = threading.RLock()
如何使用锁来同步线程呢?线程可以使用锁的acquire()
(获得)方法,这样锁就进入“locked
”状态。每次只有一个线程可以获得锁。如果当另一个线程试图获得这个锁的时候,就会被系统变为“blocked
”状态,直到那个拥有锁的线程调用锁的release()
(释放)方法,这样锁就会进入“unlocked
”状态。“blocked
”状态的线程就会收到一个通知,并有权利获得锁。如果多个线程处于“blocked
”状态,所有线程都会先解除“blocked
”状态,然后系统选择一个线程来获得锁,其他的线程继续沉默(“blocked
”)。
import threading
mylock = threading.RLock()
class mythread(threading.Thread)
...
def run(self ...):
... #此处 不可以
放置修改共享数据的代码
mylock.acquire()
... #此处 可以
放置修改共享数据的代码
mylock.release()
 
相关文档:
1.c调用python:
实例代码:
main.c调用test.py的
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//main.c
#include <windows.h>
......
下载安装MySQLdb
http://sourceforge.net/projects/mysql-python/ 好像没看到windows版本for python2.6的下载,网上搜索到一个
http://www.technicalbard.com/files/MySQL-python-1.2.2.win32-py2.6.exe
安装后import MySQLdb会出现 DeprecationWarning: the sets module is deprecated 这样一个警告,google之
......
Programming Python, 2nd Edition (O'Reilly)
http://www.osbbs.com/dl/Programming Python, 2nd Edition (O'Reilly).chm
很全很经典了python学习入门资料
OReilly - Learning Python:
http://www.osbbs.com/dl/OReilly - Learning Python.chm
......
实验环境:windows xp + vim
文件:test.py。编码:ansi
我们的目标操作test.py中保存的非英文字母。
文件头的#encoding=utf8/gbk,这个是用来说明源文件的硬盘编码以便python识别[4]。
----------------------------------------------
输入:
x = '中文'
输出: 编译失败
编译时需要知道‘中文’的硬盘编 ......
我们在做软件开发的时候很多要用到多线程技术。例如如果做一个下载软件象flashget就要用到、象在线视频工具realplayer也要用到因为要同时下载media stream还要播放。其实例子是很多的。
线程相对进程来说是“轻量级”的,操作系统用较少的资源创建和管理线程。程序中的线程在相同的内存空间中执行,并共享许多 ......