我正在编写一个程序,根据一定的条件买卖股票。它使用Python的线程库来运行其方法。每次触发买入时,它都会检查股票是否在boughtStocks字典中,并将其添加到不存在的位置,以避免重复买入。然而,该程序偶尔会立即为一只股票下几个买入订单(3-4)。我试图锁定和连接线程,使它们同步运行,但都没有解决问题。
程序的简化代码如下所示:
import threading
from obj import MyObj
obj = MyObj()
ilock = threading.Lock()
# Triggers sell orders and removes stocks from boughtStocks dictionary.
def updateStocks():
with ilock:
obj.sellCheck()
obj.updateOrders()
# Triggers buy orders if stock is not in boughtStocks and adds to boughtStocks
def scanStocks():
with ilock:
for index in range(0,30):
t1 = threading.Thread(target=obj.runScan, args=[index])
t1.start()
def main():
while obj.marketOpen():
updateThread = threading.Thread(target=updateStocks)
scanThread = threading.Thread(target=scanStocks)
threads = [updateThread, scanThread]
for t in threads:
t.start()
t.join()每次scanStocks()运行时,它都会遍历股票列表,并在将其添加到boughtStocks字典之前,在满足条件的情况下输入买入顺序。它用了一张支票
if stock not in self.boughtStocks:
check conditions here我知道我没有给出这个程序的详细工作原理,但我希望这是一个常见的线程问题,可以根据我提供的代码来识别。一旦购买了股票并将其添加到boughtStocks字典中,在从该字典中删除股票之前,不应该再购买股票。这个多个订单的问题可能会发生10%的时间。有人有什么想法吗?
发布于 2022-01-27 14:29:26
我认为您期望Lock对象以一种它不工作的方式工作。让我们一步一步地看一遍代码。我知道main是切入点。
scanStocks
updateStocks,另一个将运行第一个线程并等待它完成。这相当于调用updateStocks():这里没有线程的用处。让我们看看这个调用是干什么的:Lock,并调用obj.sellCheck()和obj.updateOrders()。这里似乎没有使用Lock,因为没有任何东西是并发运行的,但是请参阅LockscanStocks()。同样,这里没有线程的用处。让我们看看scanStocks()做了什么:scanStocks()获取锁并启动运行obj.runScan的30个线程,将值从0传递给29作为参数。这些线程同时运行,从不是joined.scanStocks(),释放Lock并退出。已启动的线程可能有finished.,也可能没有
如果市场是开放的,
obj.runScan的线程仍然在运行,也许它仍然是下一次更多的scanStocks线程再次启动的时候。因此,在简历中,锁不保护这里的任何资源。可以让多代scanStocks同时运行。
如果不了解程序的逻辑,比如访问dicts的位置,就不可能提供进一步的帮助。
https://stackoverflow.com/questions/70842228
复制相似问题