Python多线程信使模拟。卡在时间读取更新。你要做什么?

2024-06-08 20:44:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码,它模拟了一个信使系统(比如邮局或快递服务),以多线程的方式投递信件。我想添加一种方法来管理我的信使“在现场”,以提高我的系统的效率。你知道吗

太长了,读不下去了,我怎么更新我的几十到几百个线程,这样他们在调用函数之前等待更长时间?你知道吗

下面是我到目前为止编写的代码应该分步执行的操作。你知道吗

  1. 有人要一封信

  2. 我们检查一下是否有可用的信使。如果没有,我们会说“哦,对不起。帮不了你“

  3. 如果至少有一个可用,我们将发送messenger来传递信件(新的计时器线程及其wait参数表示到达和返回所需的时间)
  4. 当送信人回来时,我们把他安排在可供送信人的队伍后面,等待下一次的送信

为此,我将Messenger对象从双端队列中删除,然后在TimerRead完成等待后将其添加回队列中。这是因为我的信使都是独一无二的,最终我要跟踪每个人有多少次送货,他们走了多远,以及其他东西。你知道吗

这里有一个伪代码片段的更大的程序,我写了这个

numMessengers=5                                        
messengerDeque=deque()                             
pOrder=0.0001

class Messenger:
    def __init__(self):

for i in range(numMessengers):
    messenger=Messenger()
    messengerDeque.append(messenger)

def popDeque():
    messenger=idleDeque.popleft()
    print 'messenger #?, sent'
    return messenger

def appendDeque(messenger):
    print 'messenger #?, returned'
    messengerDeque.append(messenger)

def randomDelivery():
    if numpy.random.randint(0,10000)<=(pOrder*10000):
        if len(messengerDeque)!=0:
            messenger=popDeque()
            tripTime=distance/speed*120
            t=threading.Timer(tripTime,appendDeque,args=[messenger])
            t.start()
        else:
            print "oops, sorry. can't help you with that"

以上在我的程序中起作用。你知道吗

我想补充的是一些方法,以'重新安排'我的信使与新的命令。你知道吗

假设你收到一封信后一个小时内就要投递。你有五个信使和五个命令,所以他们都很忙。然后你得到第六个订单。 信使2号将在20分钟后回来,而订购6号需要30分钟才能到达交货地点。所以不要说“哦,我们帮不了你”。我们会说,好的,信使2号,当你回来的时候,马上去送第六封信。你知道吗

在我编写的代码中,我认为可以通过检查活动线程来完成,查看它们调用函数的时间,选择第一个您看到的时间+新传递所需时间为<;1小时的线程,取消它,然后用剩余时间加上新的等待时间启动一个新线程。你知道吗

我只是不知道怎么做。你知道吗

如何检查一段时间内还剩多长时间读取并更新它而不造成线程的混乱?你知道吗

我也乐于接受其他更聪明的方式来做我所描述的事情。你知道吗

PYTHON多线程!!!!! 谢谢你的帮助


Tags: 方法代码系统def方式时间线程messenger
1条回答
网友
1楼 · 发布于 2024-06-08 20:44:24

使用类线程计时器不会满足你的需要。尽管计时器实例中有一个“interval”成员,但一旦计时器(线程)开始运行,就不考虑interval(超时)中的任何更改。 此外,您需要知道还有多少时间可以触发计时器,据我所知,还没有一个方法。 此外,您可能还需要一种方法来确定需要用新的超时值更新哪个计时器实例,但这取决于您自己。你知道吗

您应该实现自己的计时器类,也许可以实现以下内容:

import threading
import time

class MyTimer(threading.Thread):
    def __init__(self, timeout, event):
        super(MyTimer, self).__init__()
        self.to = timeout
        self.evt = event

    def setTimeout(self, v):
        self.end = time.time() + v

    def run(self):
        self.start = time.time()
        self.end = time.time() + self.to
        while self.end > time.time():
            time.sleep(0) # instead of thread.yield
        self.evt()

    def getRemaining(self):
        return self.end - time.time()

def hi(): print "hi"


T=MyTimer(20,hi)
T.start()
for i in range(10):
    time.sleep(1)
    # isAlive gives you True if the thread is running
    print T.getRemaining(), T.isAlive() 

T.setTimeout(1)
for i in range(3):
    time.sleep(1)
    print T.getRemaining(), T.isAlive()

相关问题 更多 >