@进程
#一个执行中的程序
@线程(轻量级进程)
#同一个进程下执行的,并共享相同的上下文
#线程包括开始、执行顺序和结束
#线程是以并发方式执行,单核CPU系统中,实现是每个线程执行一小会儿。
@GIL(全局解释器锁)
#I/O密集型的Python程序要比计算密集型的代码能够更好的利用多线程。
#多线程环境中,Python虚拟机按照下面所述的方式执行。
##设置GIL
##切换进一个线程去运行
##执行下面操作之一
###指定数量的字节码指令
###线程主动让出控制权(可以调用time.sleep(0))来完成
#把线程设置回睡眠状态(切换出线程)
#解锁GIL
#重复上述步骤
@退出线程
#还可以通过调用诸如 thread.exit()之类的退出函数,或者 sys.exit()之类的退出 Python 进程的标准方法,亦或者抛出 SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。
@Python多线程模块
#thread (python3中改名为_thread不推荐使用)
#threading(推荐使用)
#Queue (队列数据结构)
@threading的使用
#创建Thread的实例,传给它一个函数
#创建Thread的实例,传给它一个可调用的类实例
#派生Thread的子类,并创建子类的实例。
@threading的属性和方法列表
#name 线程名
#ident 线程的标识符
#daemon 布尔标志,表示这个线程是否是守护线程
#__init__(group=None, target=None, name=None, args=(),kwargs={}, verbose=None, daemon=None)
#start() 开始执行线程
#run() 定义线程功能的方法
#join(timeout = None) 直至启动的线程终止之前一直挂起;除非给出了 timeout(秒),否则会一直阻塞
@创建Thread的实例,传给它一个函数
#例
#!/usr/bin/env python
# -*-coding:utf-8 -*-
import threading
from time import sleep, ctime
loops = [4, 2]
def loop(nloop, nsec):
print('start loop', nloop, 'at:', ctime())
sleep(nsec)
print('loop', nloop, 'done at:', ctime())
def main():
print('starting at:', ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(target=loop, args=(i, loops[i]))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print('all DONE at:')
if __name__ == '__main__':
main()
@创建Thread的实例,传给它一个可调用的类实例
import threading
from time import sleep, ctime
loops = [2, 4]
class ThreadFunc(object):
def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args
def __call__(self):
self.func(*self.args)
def loop(nloop, nsec):
print('start loop', nloop, 'at:', ctime())
sleep(nsec)
print('loop', nloop, 'done at:', ctime())
def main():
print('starting at:', ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(
target=ThreadFunc(loop, (i, loops[i]),
loop.__name__))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print("all Done at:", ctime())
if __name__ == '__main__':
main()
@派生Thread的子类,并创建子类的实例
import threading
from time import sleep, ctime
loops = [2, 4]
class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
def run(self):
self.func(*self.args)
def loop(nloop, nsec):
print('start loop', nloop, 'at:', ctime())
sleep(nsec)
print('loop', nloop, 'done at:', ctime())
def main():
print('starting at:', ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = MyThread(loop, (i, loops[i]), loop.__name__)
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print('all DONE at:', ctime())
if __name__ == '__main__':
main()
本文深入探讨了Python中的多线程概念,包括进程、线程、GIL的作用及影响,详细介绍了threading模块的使用方法,如创建线程实例、线程属性与方法,以及三种创建线程的方式。
606

被折叠的 条评论
为什么被折叠?



