在python多进程中,queue.put将阻止子进程?

在python多进程中,queue.put将阻止子进程?,python,Python,若只输入q 10数据,输出如下所示 如果cnt>10:kk的大小约为2000。 在2016-06-16 15:19:30:706000开始计数更改百分比MT1:在2016-06-16 15:19:33.291000结束在2016-06-16 15:19:34.990000结束在2016-06-16 15:19:36.921000结束在2016-06-16 15:19:38.748000结束在2016-06-16 15:20:06.665000结束计数更改百分比MT1: 如果输入q 20数据,输出

若只输入q 10数据,输出如下所示

如果cnt>10:kk的大小约为2000。 在2016-06-16 15:19:30:706000开始计数更改百分比MT1:在2016-06-16 15:19:33.291000结束在2016-06-16 15:19:34.990000结束在2016-06-16 15:19:36.921000结束在2016-06-16 15:19:38.748000结束在2016-06-16 15:20:06.665000结束计数更改百分比MT1:

如果输入q 20数据,输出如下:

如果cnt>20:kk的大小约为2000。 2016-06-16 15:35:36.661000:0结束2016-06-16 15:35:39.330000结束2016-06-16 15:35:40.954000结束2016-06-16 15:35:42.828000结束0结束1结束2结束2016-06-16 15:35:44.669000

如果输入q 50数据,输出如下:

如果cnt>50:kk的大小约为2000。 从2016-06-16 15:36:54.518000开始计数变化百分比MT1:在0结束2016-06-16 15:36:57.583000在1结束2016-06-16 15:36:58.886000在2结束2016-06-16 15:37:00.757000在3结束2016-06-16 15:37:02.648000

代码如下:

def do_somthing(q_out,q,i,trueStartDate,trueEndDate,preStartDate,allExistTables,stock_gainian):
    #Init conn
    conn = MySQLdb.connect(host='localhost',db='tushare',user='root',passwd='',port=3306,charset='UTF8')
    #Init df_Cc
    df_Cc = pd.DataFrame()
    df_Cc['ticker'] = pd.Series(dtype=numpy.int64,index=df_Cc.index)
    df_Cc['secShortName'] = pd.Series(dtype=numpy.object,index=df_Cc.index)
    df_Cc['percent'] = pd.Series(dtype=numpy.float64,index=df_Cc.index)
    df_Cc['startPrice'] = pd.Series(dtype=numpy.float64,index=df_Cc.index)
    df_Cc['endPrice'] = pd.Series(dtype=numpy.float64,index=df_Cc.index)
    df_Cc['startDate'] = pd.Series(dtype=numpy.object,index=df_Cc.index)
    df_Cc['endDate'] = pd.Series(dtype=numpy.object,index=df_Cc.index)
    df_Cc['gainian'] = pd.Series(dtype=numpy.object,index=df_Cc.index)
    df_Cc['shizhi'] = pd.Series(dtype=numpy.float64,index=df_Cc.index)
    df_Cc['liutong'] = pd.Series(dtype=numpy.float64,index=df_Cc.index)
    while True:
        aa = q.get()
        if aa != None:
            ticker = aa[0]
            secShortName = aa[1]
            totalShares = aa[2]
            nonrestfloatA = aa[3]
            listDate = datetime.datetime.strptime(aa[4], "%Y-%m-%d")
            stock_mktequd_name = '%s%06d' % (init.g_mktequd,ticker)
            if (stock_mktequd_name in allExistTables) & (trueEndDate>=listDate>=trueStartDate)==False:
                str = 'select * from %s where tradeDate>=\'%s\' and tradeDate<=\'%s\' order by tradeDate' % (stock_mktequd_name,trueStartDate.strftime("%Y-%m-%d"),trueEndDate.strftime("%Y-%m-%d"))
                df = pd.read_sql(str,conn)

                l = len(df_Cc)
                df_Cc.at[l,'ticker'] = ticker
                df_Cc.at[l,'secShortName'] = secShortName
                nn = df.shape[0]
                if nn>0:
                    #
                    startPrice = df.iloc[0]['preClosePrice']*GetQfq(ticker,preStartDate,conn)  # if nn>=n else df.iloc[0]['preClosePrice']*1
                    endPrice = df.iloc[nn-1]['closePrice']*df.iloc[nn-1]['accumAdjFactor']
                    percent = (endPrice-startPrice)/startPrice*100 # if startPrice!=0 else -100
                    df_Cc.at[l,'startDate'] = df.iloc[0]['tradeDate']
                    df_Cc.at[l,'endDate'] = df.iloc[nn-1]['tradeDate']
                    df_Cc.at[l,'percent'] = percent
                    df_Cc.at[l,'startPrice'] = startPrice
                    df_Cc.at[l,'endPrice'] = endPrice
                    df_gn = stock_gainian.query('ticker==%s' % ticker)
                    if df_gn.shape[0]==1:
                        df_Cc.at[l,'gainian'] = df_gn.iloc[0]['ref_gainian']
                    df_Cc.at[l,'shizhi'] = totalShares*startPrice/100000000
                    df_Cc.at[l,'liutong'] = nonrestfloatA*startPrice/100000000
        else:
            break

    q_out.put(df_Cc)
    conn.close()
    print 'end-in %s %s' % (i,datetime.datetime.now())


if __name__ == '__main__':
    q = multiprocessing.Queue()
    kk = allStocksBasicInfo.set_index(['ticker','secShortName','totalShares','nonrestfloatA','listDate']).T.to_dict()
    cnt = 0
    for k in kk:
        q.put(k)
        cnt = cnt+1
        if cnt>10:   # kk's size is about 2000.
            break

    #q_out
    q_out = multiprocessing.Queue()
    #fork NUM
    NUM = multiprocessing.cpu_count()
    t = [1]*NUM
    #
    for i in xrange(NUM):
        q.put(None)

    for i in xrange(NUM):
        t[i] = multiprocessing.Process(target=do_somthing, args=(q_out,q,i,trueStartDate,trueEndDate,preStartDate,init.g_data.allExistTables,init.g_data.stockGainian))
        t[i].start()
    for i in xrange(NUM):
        t[i].join()
        print('end %s' % i)