多线程
Python中的线程是真正的POSIX Thread,而不是模拟出来的线程。这一点与Java不同,Java中的线程是运行在JVM上的线程。
注意, Python由于设计时有GIL全局锁,导致了过线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。
尽管如此,还是来学习一下Python中的多线程,用threading
这个高级模块。启动一个线程就把一个函数传入并创建Thread
实例,然后调用start()
开始执行。
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
任何进程默认会启动一个线程,这个线程名字就叫MainThread
。 在创建Thread
时,也可以指定线程名称,这里指定为LoopThread
.
Lock
每个进程都有自己独立的地址空间,但是线程不一样,一个进程可以有多个线程,进程内的数据可以被线程共享。这样就存在同步的问题,解决同步问题的常用方法就是加锁。
import time, threading
balance = 0
def change_it(n):
global balance # balance是全局变量,回忆变量作用域部分
balance = balance + n
balance = balance - n
def run_thread(n):
for i in range(10000000):
change_it(n)
t1 = threading.T