在python中锁定并不像预期的那样

时间:2018-03-12 17:43:13

标签: python multithreading concurrency locking

我有这段代码:

SP500 = pd.read_csv("http://trading.chrisconlan.com/SPstocks_current.csv", header=-1, names=['Symbol']).copy()
SP500=list(SP500.Symbol)
SP500=['AVGO', 'GM', 'FDX', 'goog']

threads = []
lock = threading.Lock()
offset = 1
multiply = 1
num_of_threads = 4
for i in range(0, num_of_threads):
    t = threading.Thread(target=digest_distros, args=(SP500, i * multiply, i * multiply + offset))
    t.start()
    threads.append(t)
for t in threads:
    t.join()

这是func

def digest_distros(SPT500, start, finish):
    for stock in SP500[start:finish]:

        daily, stock_distro = get_daily_adjusted(stock)
        if daily is None:
            continue
        monthly_adjusted_close=get_monthly_adjusted(stock)
        if monthly_adjusted_close is None:
            continue

        with lock:
            print "\n"
            print "##############   " + stock + "   ##############"
            print daily[['low', 'high', 'open', 'adjusted close']].tail(1)
            print "\n"

            curr_monthly_adjusted=monthly_adjusted_close[-1]
            print "##########################"
            print "current monthly adjusted close is: {}".format(curr_monthly_adjusted)
            required_value_for_signal=find_min_signal_value(monthly_adjusted_close)
            print "Required value for signal tommorow is : {}".format(required_value_for_signal)
            print "##########################"

            print "\n"

            spans = [0.3, 0.5, 1, 2,3,5]
            for span in spans:
                mean=stock_distro[span][0]
                std=stock_distro[span][1]
                if abs(curr_monthly_adjusted-required_value_for_signal) < 3:
                    print "Time span is {:.3f} years, daily change mean {:.3f}, daily change std {:.3f}".format(span,mean,std)
                    z_value=calculate_z_value(required_value_for_signal, curr_monthly_adjusted, mean, std)
                    # if z_value>0.3:
                    print "Probability is: {:.3f}".format(z_value)

运行时,如果代码到达for循环内部的代码或if语句内部(我认为),我就失去了锁...

无法理解原因。

混合打印的输出示例。

######## GM #

目前每月调整收盘价为:37.64 信号tommorow所需的值是:38.5

时间跨度为0。300年,每日变化均值-0.083,每日变化标准为0.692 概率为:0.869 时间跨度为0。500年,每日变化平均值为0.004,每日变化标准为0.663 概率为:0.904 时间跨度为1。000年,每日变化意味着0.009,每日变化标准为0.531 概率为:0.949

时间跨度为2。000年,每日更改平均值为0.018,每日更改标准为0.512 ############## AVGO ##############

概率为:0.957 时间跨度为3。000年,每日变化平均值为0.005,每日变化标准为0.495 概率为:0.960 时间跨度为5。000年,每日变化平均值为0.011,每日变化标准为0.477 概率为:0.966

1 个答案:

答案 0 :(得分:0)

获得所需内容的最简单方法是在退出锁之前刷新输出缓冲区。像这样:

with lock:
    # ... stuff
    print(stuff)
    # etc.
    sys.stdout.flush()

为什么这有必要?因为print实际上并没有在终端上放置任何内容。它的作用是将一些东西放在sys.stdout缓冲区中,这样它最终会进入屏幕。那&#34;最终&#34;很可能在你释放锁之后。

锁定效果很好,代码中没有任何内容没有锁定;问题是锁定不会强制Universe中的每个文件或其他缓冲类型变为无缓冲。这样考虑一下:如果你从锁内部通过网络send数据,那么当你解除锁定时,无法保证对方已收到数据(等待除外) ,仍然持有锁,以获得一些承认)。