嘿哈~所有一切的第一,感谢谷溪老师的指导。记得一开始写多进程也是谷老师提(xi)议(nao)的。今天由业余级别编程高(cai)手(niao)来给大伙讲讲多线程,多进程这类程式的应用吧。
其实是再一次遇到了一个现实问题,实时行情API调取测速。一上手我写了个这个,
#from multiprocessing import Pool
from multiprocessing.dummy import Pool
import rqdatac
from aoaoao import *
import datetime
w.start()
rqdatac.init()
rq_stk_list_300 = rqdatac.index_components('000300.XSHG') #around 300
rq_stk_list_500 = rqdatac.index_components('000905.XSHG') #around 500
rq_stk_list_50 = rqdatac.index_components('000016.XSHG') #around 50
rq_stk_list_future = ['IC201812','IF201812','IH201812']
rq_stk_list = rq_stk_list_300 + rq_stk_list_500 + rq_stk_list_50 + rq_stk_list_future
wd_stk_list_01 = tesww("sectorconstituent","date=2018-09-19;windcode=000300.SH").Data
wd_stk_list_02 = tesww("sectorconstituent","date=2018-09-19;windcode=000016.SH").Data
wd_stk_list_03 = tesww("sectorconstituent","date=2018-09-19;windcode=000905.SH").Data
wd_stk_list_future = ['IC201812.CFE','IF201812.CFE','IH201812.CFE']
wd_stk_list = wd_stk_list_01 + wd_stk_list_02 + wd_stk_list_03 + wd_stk_list_future
def wind_time_stamp():
data_start=datetime.datetime.now()
data=qsww(wd_stk_list, "rt_date,rt_time,rt_last")
data_end=datetime.datetime.now()
print('wind',data_start,data_end)
def rq_time_stamp():
data_start=datetime.datetime.now()
data=rqdatac.current_snapshot(rq_stk_list)
data_end=datetime.datetime.now()
print('rq',data_start,data_end)
def fake_function(func): #假函数为了map分别调
func()
if __name__ == "__main__":
func_list=[wind_time_stamp,rq_time_stamp]
with Pool(2) as p:
p.map(fake_function, func_list)
其实最主要的精华是第一行和第二行,谷老师指出这个multiprocessing的一个妙哉,就是multiprocess 和 multiprocessing.dummy的切换。
你可以先多进程multiprocessing走一遍,再注释掉,用dummy走一遍。其他代码啥都不用改。以此比较到底谁快。
接下来是threading的登场,这货请注意尾部。
import threading
import rqdatac
from aoaoao import *
import datetime
w.start()
rqdatac.init()
rq_stk_list_300 = rqdatac.index_components('000300.XSHG') #around 300
rq_stk_list_500 = rqdatac.index_components('000905.XSHG') #around 500
rq_stk_list_50 = rqdatac.index_components('000016.XSHG') #around 50
rq_stk_list_future = ['IC201812','IF201812','IH201812']
rq_stk_list = rq_stk_list_300 + rq_stk_list_500 + rq_stk_list_50 + rq_stk_list_future
wd_stk_list_01 = tesw("sectorconstituent","date=2018-09-19;windcode=000300.SH").Data
wd_stk_list_02 = tesw("sectorconstituent","date=2018-09-19;windcode=000016.SH").Data
wd_stk_list_03 = tesw("sectorconstituent","date=2018-09-19;windcode=000905.SH").Data
wd_stk_list_future = ['IC201812.CFE','IF201812.CFE','IH201812.CFE']
wd_stk_list = wd_stk_list_01 + wd_stk_list_02 + wd_stk_list_03 + wd_stk_list_future
def wind_time_stamp():
data_start=datetime.datetime.now()
data=qsww(wd_stk_list, "rt_date,rt_time,rt_last")
data_end=datetime.datetime.now()
print('wind',data_start,data_end)
def rq_time_stamp():
data_start=datetime.datetime.now()
data=rqdatac.current_snapshot(rq_stk_list)
data_end=datetime.datetime.now()
print('rq',data_start,data_end)
threads = []
t1 = threading.Thread(target=wind_time_stamp)
threads.append(t1)
t2 = threading.Thread(target=rq_time_stamp)
threads.append(t2)
if __name__ == "__main__":
for t in threads:
#t.setDaemon(True)
t.start()
#t.join()
t.join()
t.start()形同到了这两个function的开头,它们先很快的被开启,放到同一起跑线。最后一个t.join()形同一起开跑但是等待对方结束才退出。
据说还有fork思路fork出来一块内存一起跑,恕臣妾做不到,毕竟windows...不倒腾。