首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同步运行的Python线程

不同步运行的Python线程
EN

Stack Overflow用户
提问于 2022-01-25 00:51:39
回答 1查看 98关注 0票数 0

我正在编写一个程序,根据一定的条件买卖股票。它使用Python的线程库来运行其方法。每次触发买入时,它都会检查股票是否在boughtStocks字典中,并将其添加到不存在的位置,以避免重复买入。然而,该程序偶尔会立即为一只股票下几个买入订单(3-4)。我试图锁定和连接线程,使它们同步运行,但都没有解决问题。

程序的简化代码如下所示:

代码语言:javascript
复制
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字典之前,在满足条件的情况下输入买入顺序。它用了一张支票

代码语言:javascript
复制
if stock not in self.boughtStocks:
    check conditions here

我知道我没有给出这个程序的详细工作原理,但我希望这是一个常见的线程问题,可以根据我提供的代码来识别。一旦购买了股票并将其添加到boughtStocks字典中,在从该字典中删除股票之前,不应该再购买股票。这个多个订单的问题可能会发生10%的时间。有人有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-27 14:29:26

我认为您期望Lock对象以一种它不工作的方式工作。让我们一步一步地看一遍代码。我知道main是切入点。

scanStocks

  • Starts

  • 创建两个线程,一个将运行updateStocks,另一个将运行第一个线程并等待它完成。这相当于调用updateStocks():这里没有线程的用处。让我们看看这个调用是干什么的:
  1. 'updateStocks‘获取一个Lock,并调用obj.sellCheck()obj.updateOrders()。这里似乎没有使用Lock,因为没有任何东西是并发运行的,但是请参阅Lock

  1. 启动第二个线程并等待它完成。这相当于只调用scanStocks()。同样,这里没有线程的用处。让我们看看
    1. scanStocks()做了什么:
      1. scanStocks()获取锁并启动运行obj.runScan的30个线程,将值从0传递给29作为参数。这些线程同时运行,从不是joined.
      2. scanStocks(),释放Lock并退出。已启动的线程可能有finished.

    ,也可能没有

如果市场是开放的,

  1. ,回到第一步。也许一些运行obj.runScan的线程仍然在运行,也许它仍然是下一次更多的scanStocks线程再次启动的时候。

因此,在简历中,锁不保护这里的任何资源。可以让多代scanStocks同时运行。

如果不了解程序的逻辑,比如访问dicts的位置,就不可能提供进一步的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70842228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档