Created
March 12, 2019 13:49
-
-
Save stoensin/4ed441e4763323fe94e909a1f3bc48dc to your computer and use it in GitHub Desktop.
线程:每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 线程可以分为: 内核线程:由操作系统内核创建和撤销。 用户线程:不需要内核支持而在用户程序中实现的线程。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import threading | |
import time | |
class MyThread(threading.Thread): | |
def run(self): | |
global num | |
time.sleep(1) | |
if mutex.acquire(1): | |
num +=1 | |
msg = self.name + 'set num to ' +str(num) | |
print msg | |
mutex.release() | |
num = 0 | |
mutex = threading.Lock() | |
def test(): | |
for i in range(5): | |
t = MyThread() | |
t.start() | |
if __name__=="__main__": | |
test() | |
import time, threading | |
# 假定这是你的银行存款: | |
balance = 0 | |
lock = threading.Lock() | |
def change_it(n): | |
# 先存后取,结果应该为0: | |
global balance | |
balance = balance + n | |
balance = balance - n | |
def run_thread(n): | |
for i in range(100000): | |
# 先要获取锁: | |
lock.acquire() | |
try: | |
# 放心地改吧: | |
change_it(n) | |
finally: | |
# 改完了一定要释放锁: | |
lock.release() | |
t1 = threading.Thread(target=run_thread, args=(5,)) | |
t2 = threading.Thread(target=run_thread, args=(8,)) | |
t1.start() | |
t2.start() | |
t1.join() | |
t2.join() | |
print(balance) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time, threading | |
# 新线程执行的代码: | |
def loop(): | |
print('thread %s is running...' % threading.current_thread().name) | |
n = 0 | |
while n < 5: | |
n = n + 1 | |
print('thread %s >>> %s' % (threading.current_thread().name, n)) | |
time.sleep(1) | |
print('thread %s ended.' % threading.current_thread().name) | |
print('thread %s is running...' % threading.current_thread().name) | |
t = threading.Thread(target=loop, name='LoopThread') | |
t.start() | |
t.join() | |
print('thread %s ended.' % threading.current_thread().name) | |
''' | |
thread MainThread is running... | |
thread LoopThread is running... | |
thread LoopThread >>> 1 | |
thread LoopThread >>> 2 | |
thread LoopThread >>> 3 | |
thread LoopThread >>> 4 | |
thread LoopThread >>> 5 | |
thread LoopThread ended. | |
thread MainThread ended. | |
''' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import threading | |
# 创建全局ThreadLocal对象: | |
local_school = threading.local() | |
def process_student(): | |
# 获取当前线程关联的student: | |
std = local_school.student | |
print('Hello, %s (in %s)' % (std, threading.current_thread().name)) | |
def process_thread(name): | |
# 绑定ThreadLocal的student: | |
local_school.student = name | |
process_student() | |
t1 = threading.Thread(target= process_thread, args=('张三',), name='Thread-1') | |
t2 = threading.Thread(target= process_thread, args=('李四',), name='Thread-2') | |
t1.start() | |
t2.start() | |
t1.join() | |
t2.join() | |
''' | |
上面实现了student变成一个 local_school对象的属性,每个Thread都可以读取student属性,每个线程读取的都是该线程的局部变量,不会造成错乱,也无需管理锁的问题。ThreadLocal最常用的地方就是为每个线程绑定一个数据库连接,HTTP请求,用户身份信息等配置信息,这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。 | |
''' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。 指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存
这个好像和jvm虚拟机是同一个原理, 有没有关于这方面更多的信息可以参考啊博主?