是否可以一定速度发送数据(每秒x个项目)

时间:2019-06-18 00:09:13

标签: python

(只想提一下,这是我的第一个问题,如果我做错了事,我深表歉意)。我正在制作一个解析CSV文件并将其保存为列表的Python程序。但是,该程序需要用户输入有关他们想要将该数据发送到服务器的速度。我将如何调节数据发送的速度(即100项/秒等),我在GUI前端和CSV模块中使用PyQt5来解析文件。为了进行测试,我将数据发送到Python脚本编写的另一个CSV。

我已经尝试过睡眠以及日期和时间,但是由于读/写数据不是即时的,因此不会是x项/ 1秒。我真的找不到任何文档,但是我觉得日期和时间仍然可行,尽管我真的不知道如何,因为我是一个初学者。

我希望程序读取CSV文件并将其以特定速率/秒写入/发送到另一个文件。我只让程序以正常速度写入。

谢谢。

1 个答案:

答案 0 :(得分:1)

正如@KlausD所说,如果要在发送之间进行处理,则可以在线程中执行某些操作并使用队列。但是您可能只想在主线程中循环发送即可。如何遍历项目并延迟以使它们以正确的速率发送它们应该完全独立于代码的实际结构。

您不必担心提前会导致发送速率延迟的原因,而您想要做的是自适应延迟。因此,您可以算出实际执行发送的时间,然后将要等待的剩余时间延迟一遍,再执行一次发送。如果您的主要目标是平均发送速率,而不是两次发送之间的实际延迟(我认为会是这种情况),那么您只想查看到目前为止已发送项目花费了多长时间与多少次发送有关您发送的内容。由此,您可以适应性地延迟几乎完全将总发送时间调整为所需的时间。在成百上千的发送中,您可以保证几乎与用户要求的速率相同。下面是一个示例,该示例将所有数据发送仅提取到print()语句和随机延迟中:

import time
import random

# Send this many items per second
sends_per_second = 10

# Simulate send time by introducing a random delay of at most this many seconds
max_item_delay_seconds = .06

# How many items to send
item_count = 100

# Do something representing a send, introducing a random delay
def do_one_item(i):
    time.sleep(random.random() * max_item_delay_seconds)
    print("Sent item {}".format(i))

# Record the starting time
start_time = time.time()

# For each item to send...
for i in range(item_count):

    # Send the item
    do_one_item(i)

    # Compute how much time we've spent so far
    time_spent = time.time() - start_time

    # Compute how much time we want to have spent so far based on the desired send rate
    should_time = (i + 1) / sends_per_second

    # If we're going too fast, wait just long enough to get us back on track
    if should_time > time_spent:
        print("Delaying {} seconds".format(should_time - time_spent))
        time.sleep(should_time - time_spent)

time_spent = time.time() - start_time
print("Sent {} items in {} seconds ({} items per second)".format(item_count, time_spent, item_count / time_spent))

缩写输出:

Sent item 0
Delaying 0.06184182167053223 seconds
Sent item 1
Delaying 0.0555738925933838 seconds
...
Sent item 98
Delaying 0.036808872222900746 seconds
Sent item 99
Delaying 0.03746294975280762 seconds
Sent 100 items in 10.000335931777954 seconds (9.999664079506683 items per second)

您可以看到,尽管代码为每次发送引入了随机延迟,因此延迟逻辑必须计算整个位置的延迟,但实际获得的发送速率恰好是要求的5左右小数位。

在此示例中,您可以玩数字游戏。您应该能够说服自己,除非每次发送都花费太长时间以跟上您请求的速率,否则您可以使用这种逻辑拨打您想要的任何发送速率。您还可以看到您添加了太多的模拟延迟来表示发送时间,以致无法跟上所需的速率,您将不会收到任何延迟调用,并且代码将尽快发送项目。