Python 是否可以以特定速度(每秒x个项目)发送数据
(只是想提一下,这是我的第一个问题,如果我做错了什么,我道歉)。我正在制作一个Python程序,解析CSV文件并将其保存为列表。但是,该程序将用户输入的数据发送到服务器的速度。我将如何调节数据发送的速度(即100项/秒等)。我正在使用PyQt5作为GUI前端和CSV模块来解析文件。出于测试目的,我将数据发送到Python脚本编写的另一个CSV 我试过睡眠、日期和时间,但因为读/写数据不是即时的,所以不会是x项/1秒。我真的找不到任何文档,但我觉得日期和时间还是可行的,虽然我真的不知道怎么做,因为我是一个初学者 我想让程序读取CSV文件,并以一定的速率/秒将其写入/发送到另一个文件。我只让程序以正常速度编写它Python 是否可以以特定速度(每秒x个项目)发送数据,python,Python,(只是想提一下,这是我的第一个问题,如果我做错了什么,我道歉)。我正在制作一个Python程序,解析CSV文件并将其保存为列表。但是,该程序将用户输入的数据发送到服务器的速度。我将如何调节数据发送的速度(即100项/秒等)。我正在使用PyQt5作为GUI前端和CSV模块来解析文件。出于测试目的,我将数据发送到Python脚本编写的另一个CSV 我试过睡眠、日期和时间,但因为读/写数据不是即时的,所以不会是x项/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位左右
您可以使用本例中的数字。您应该能够说服自己,除非每次发送都需要很长时间才能跟上您请求的速率,否则您可以使用这种逻辑拨打任何您想要的发送速率。您还可以看到,您添加了太多的模拟延迟来表示发送时间,因此无法跟上所需的速率,您将不会收到延迟调用,代码将以尽可能快的速度发送项目。您将创建一个队列,在其中放入数据项目,并创建一个线程,该线程使用队列中的项目,并在每次发送后等待一段时间。在计算等待时间时,您可能需要补偿发送时间。谢谢!这是非常有帮助的,而且肯定是处理这个问题的更好的方法。我只想澄清一下,这种方法在发送时,比如说每秒200个项目,将在一秒钟内大致间隔200个项目,或者在四分之一秒内发送200个项目,然后等待.75秒,然后再发送下一批。我认为这一区别可能会对使用服务器产生影响,尽管我必须询问我的主管对此问题的看法。再次感谢您。在完成代码并在我的程序中使用它之后,它变得更有意义了。谢谢你的帮助对不起,我以前没看到你的问题。您可能已经弄明白了,但每次发送之间都会延迟,因此没有批处理。如果您确实想进行批处理,您当然可以添加一个内部循环,而只需在外部循环中进行速率调节。