我有这段代码:
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
答案 0 :(得分:0)
获得所需内容的最简单方法是在退出锁之前刷新输出缓冲区。像这样:
with lock:
# ... stuff
print(stuff)
# etc.
sys.stdout.flush()
为什么这有必要?因为print
实际上并没有在终端上放置任何内容。它的作用是将一些东西放在sys.stdout
缓冲区中,这样它最终会进入屏幕。那&#34;最终&#34;很可能在你释放锁之后。
锁定效果很好,代码中没有任何内容没有锁定;问题是锁定不会强制Universe中的每个文件或其他缓冲类型变为无缓冲。这样考虑一下:如果你从锁内部通过网络send
数据,那么当你解除锁定时,无法保证对方已收到数据(等待除外) ,仍然持有锁,以获得一些承认)。