没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
14页
python期货量化书推荐_Python期货量化交易基础教程(12) 12、多线程threading模块: 多线程也是实现异步任务的⽅式之⼀,通常线程是进程中的⼦任务,多个线程可以在同⼀进程中实现并发执⾏,共享进程的资源,多线程和 多进程的很多操作⽅法都类似,threading模块⽀持多线程。⽬前线程被设计为不能被销毁、停⽌、暂停、恢复或中断。 threading模块的主要⽅法有:current_thread():返回当前对应调⽤者的控制线程的Thread 对象。如果调⽤者的控制线程不是利⽤ threading 创建,会返回⼀个功能受限的虚拟线程对象MainThread。 enumerate(): 返回⼀个包含当前存活的线程的列表。该列表包含主线程和守护线程,current_thread() 创建的虚拟线程对象和主线程。它 不包含已终结的线程和尚未开始的线程。 active_count(): 返回当前存活的线程类Thread 对象,包含主线程。返回的计数等于enumerate() 返回的列表长度。 12.1、Thread类: 线程由threading模块的Thread类创建,Threa
资源推荐
资源详情
资源评论
python期货量化书推荐_Python期货量化交易基础教程(12)
12、多线程threading模块:
多线程也是实现异步任务的⽅式之⼀,通常线程是进程中的⼦任务,多个线程可以在同⼀进程中实现并发执⾏,共享进程的资源,多线程和
多进程的很多操作⽅法都类似,threading模块⽀持多线程。⽬前线程被设计为不能被销毁、停⽌、暂停、恢复或中断。
threading模块的主要⽅法有:current_thread():返回当前对应调⽤者的控制线程的Thread 对象。如果调⽤者的控制线程不是利⽤
threading 创建,会返回⼀个功能受限的虚拟线程对象MainThread。
enumerate(): 返回⼀个包含当前存活的线程的列表。该列表包含主线程和守护线程,current_thread() 创建的虚拟线程对象和主线程。它
不包含已终结的线程和尚未开始的线程。
active_count(): 返回当前存活的线程类Thread 对象,包含主线程。返回的计数等于enumerate() 返回的列表长度。
12.1、Thread类:
线程由threading模块的Thread类创建,Thread类的参数形式为:
Thread(group: None=..., target: Optional[Callable[..., Any]]=..., name: Optional[str]=..., args: Iterable[Any]=..., kwargs:
Mapping[str, Any]=..., daemon: Optional[bool]=...):group默认为None,为了⽇后扩展 ThreadGroup 类实现⽽保留的参数;target
是⽤于run()⽅法调⽤的可调⽤对象,即要执⾏的⼦线程函数,默认是 None,表⽰不需要调⽤任何⽅法;name是线程名称;args是⼦线程
函数的位置参数元组,默认是空元组(,);kwargs是⼦线程函数的关键字参数字典,默认是空字典{};daemon参数为True线程为守护模
式,默认为None,线程将继承当前线程的守护模式属性。
Thread类的属性和⽅法有:start():启动线程,它安排run() ⽅法在⼀个独⽴的控制进程中被调⽤,以执⾏⼦线程函数。
run():实际执⾏线程函数
is_alive():判断线程是否存活状态,存活状态返还True,否则返回False。
setName(str):设置线程名。
getName():返回线程名,也可⽤name属性获取或者修改。
join(timeout=None):阻塞主线程,等待⼦线程执⾏结束。若给定timeout值,为超时时间,超过timeout不再阻塞。必须⽤start()启动线
程才能使⽤join()⽅法。
我们看⼀下多线程的⽰例:
import time
import threading
def func(a,b,y,c=3,d=4):
print('开始执⾏⼦线程:',a,'c+d:',c+d)
t0=time.time()
global x
x=y
time.sleep(b)
print('⼦线程'+a+'的x:',x)
print('⼦线程'+a+'执⾏结束,⽤时:',time.time()-t0)
x=60
f1=threading.Thread(target=func,args=('f1',2,10),kwargs={'c':5,'d':6})
f2=threading.Thread(target=func,name='mm',args=('f2',6,100),kwargs={'c':7,'d':8})
f3=threading.Thread(target=func,name='nn',args=('f3',10,200),kwargs={'c':9,'d':10})
t0=time.time()
f1.setName('kk')
f1.start()
print('f1执⾏状态:',f1.is_alive())
f1.join()
print('f1执⾏状态:',f1.is_alive())
#f3.daemon=True
f2.start()
f3.start()
print('当前的线程变量:',threading.current_thread())
print('正在执⾏的线程列表:',threading.enumerate())
print('正在执⾏的线程数量',threading.active_count())
print('f2执⾏状态:',f2.is_alive())
f2.join(2)
print('f2执⾏状态:',f2.is_alive())
print('⼦线程f1的名字:{0},即:{1}'.format(f1.name,f1.getName()))
print('⼦线程f2的名字:{0},即:{1}'.format(f2.name,f2.getName()))
print('⼦线程f3的名字:{0},即:{1}'.format(f3.name,f3.getName()))
print('主线程的x:',x)
print('主线程执⾏结束,⽤时:',time.time()-t0)
'''输出结果为:开始执⾏⼦线程:f1执⾏状态: Truef1 c+d: 11⼦线程f1的x: 10⼦线程f1执⾏结束,⽤时: 2.0015344619750977f1执⾏
状态: False开始执⾏⼦线程: 开始执⾏⼦线程:f2 当前的线程变量:c+d:f3 <_mainthread started>15c+d:正在执⾏的线程列
表:19[<_mainthread started>, , ]正在执⾏的线程数量 3f2执⾏状态: Truef2执⾏状态: True⼦线程f1的名字:kk,即:kk⼦线程f2的名
字:mm,即:mm⼦线程f3的名字:nn,即:nn主线程的x: 200主线程执⾏结束,⽤时: 4.018061876296997⼦线程f2的x: 200⼦线程f2执
⾏结束,⽤时: 6.00093674659729⼦线程f3的x: 200⼦线程f3执⾏结束,⽤时: 10.00103235244751'''
该例实例化了三个⼦线程f1、f2、f3,当前程序为主线程,主线程和三个⼦线程并发执⾏,因此最终执⾏的时间和最慢的⼦线程f3的时间
⼀样,从输出结果可以知道⼦线程⾥调⽤线程⽅法的执⾏过程。
需要注意的是:主线程⾥定义的全局变量x被⼦线程修改了,正说明⼦线程共⽤了主线程的资源,因此,多线程更容易出现资源竞争的可
能。
也可以通过继承Thread类⾃定义线程类以实现个性化功能,⾃定义类需要在初始化函数⾥⽤super().__init__()先执⾏Thread类的初始化,
并重写run()⽅法,我们把上例改写,⽤⾃定义线程类创建⼦线程,例如:
import time
import threading
def func(a,b,y,c=3,d=4):
print('开始执⾏⼦线程:',a,'c+d:',c+d)
t0=time.time()
global x
x=y
time.sleep(b)
print('⼦线程'+a+'的x:',x)
print('⼦线程'+a+'执⾏结束,⽤时:',time.time()-t0)
return c+d
class MyThread(threading.Thread):
def __init__(self,target,args,kwargs):
super().__init__()
self.target=target
self.args=args
self.kwargs=kwargs
def run(self):
self.res=self.target(*self.args,**self.kwargs)
x=60
f1=MyThread(target=func,args=('f1',2,10),kwargs={'c':5,'d':6})
f2=MyThread(target=func,args=('f2',6,100),kwargs={'c':7,'d':8})
f3=MyThread(target=func,args=('f3',10,200),kwargs={'c':9,'d':10})
t0=time.time()
f1.setName('kk')
f1.start()
print('f1执⾏状态:',f1.is_alive())
f1.join()
print('f1执⾏状态:',f1.is_alive())
#f3.daemon=True
f2.start()
f3.start()
print('当前的线程变量:',threading.current_thread())
print('正在执⾏的线程列表:',threading.enumerate())
print('正在执⾏的线程数量',threading.active_count())
print('f2执⾏状态:',f2.is_alive())
f2.join(2)
print('f2执⾏状态:',f2.is_alive())
print('⼦线程f1的名字:{0},即:{1}'.format(f1.name,f1.getName()))
剩余13页未读,继续阅读
资源评论
是空空呀
- 粉丝: 168
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功