@
进程
进程
#
一个执行中
的程序
@线程(轻量级进程)
#同一个进程下执行的,并共享相同的上下文
#线程包括开始、执行顺序和结束
#线程是以并发方式执行,单核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
(秒),否则
会一直阻塞
直至启动的线程终止之前一直挂起;除非给出了
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
的子类,并创建子类的实例
派生
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()
版权声明:本文为glfxml原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。