环境:win 7+spyder2.38+py3.5
这几天在写个使用 multiprocessing 调用 Pool 进程池的程序,原本使用函数的方式,一切正常。后来改成了 class的方式,就一直出问题,排查后发现如果在类中 使用了 自己定义的 import 的包中的类/函数/方法,然后多进程调用的方法中如果使用了这些,就会导致cpu高占用,但是程序并没有报错,最后测试使用如下的程序是可以的。
TIPS:
- 这种方法太丑陋,貌似如果要自定义使用多进程的类,应该是继承 multiprocessing类,应该是有优美一些的方法,后面有时间再研究一下;
- 使用多进程,一定要在非多进程的环境下先调试确认,多进程很多时候程序有问题,却不报错或者报的错误信息很难把握。
#a.py
TABLE = 'st_trade' #将 MyTS.get_stock_to_db()中要使用到的变量,都定义为全局变量。
DB_engine = sa.create_engine('mysql...')
LOG = open(r'D:\xx.log', 'a')
class MyTS(object):
def __init__(self):
self.trade_table = TABLE #__init__中不能有import包中的内容。
def get_stock_to_db(self, code, start, end, atype='hfq'): # Pool池apply的方法,不能有import包中的内容。
pass
def update_trades_db(self, atype='hfq', mp_cnt=10):
import Models #在这里可以使用
mp_pool = Pool(mp_cnt)
for code in codes:
mp_pool.apply_async(self.get_stock_to_db, args=(str(code), str(newest_date), str(end_date), atype,))
mp_pool.close()
mp_pool.join()