繁体   English   中英

在 Django 中排队要请求的图片

[英]Queuing pictures to be requested in Django

我正在建立一个系统,其中一个用户将图像发布到 Django 服务器,而 N 个用户将每个人并行查看发布图像的子集。 我似乎无法在 Django 中找到队列机制来完成此任务。 最接近的方法是在 filter() 中使用 latest,但这只会一遍又一遍地发送最新图像,直到出现新图像。 任务队列没有帮助,因为这不是一个周期性任务,它只在用户要求下一张图片时发生。 我有一个用于上传图像的视图集,另一个用于获取。 我想过使用python线程安全队列。 卸载器会将上传的图像 pk 入队,当多个用户请求新图像时,发送视图集将出队图像 pk 并将其发送给最近请求图像的用户,然后将下一个出队给第二个最近的用户和很快...

但是,我仍然觉得这里可能存在一些竞争条件。 我读到 Django 是线程安全的,但该应用程序可能变得非线程安全。 此外,队列需要是全局的才能在视图集之间共享,这感觉是不好的做法。 有没有更好更安全的方法来解决这个问题?

编辑

这里有更多关于我要完成的任务的详细信息,并为其提供了一些背景信息。 发布图片的用户是连接到无人机的智能手机。 它将以恒定的时间间隔将天空中的图片发布到 Django 服务器。 因为会有很多图片进来。我希望能够让多个用户分担查看所有图片的工作量(即没有两个用户应该看到相同的图片)。 因此,当用户联系 Django 服务器时,说“将您拥有的下一张图片发送给我,或者将您拥有的下 3 张图片发送给我,等等……”。 但是,多个用户可能会同时说这句话。 所以 Django 需要对图片保持某种排序,这就是为什么我说 Queue 并弄清楚如果一次有多个用户询问时如何将它传递给用户。 所以一个Viewset是让智能手机发布图片,另一个是让用户请求图片。 我正在寻找一种线程安全的方法来做到这一点。 到目前为止,我唯一的想法是使用 Python 的线程安全队列并使其成为视图集的全局队列。 但是,我觉得这是不好的做法,我不确定它对 Django 是否是线程安全的。

Django 本身没有队列,但您可以轻松模拟它。 就个人而言,我可能会使用外部服务,例如 rabbitMQ,但如果您愿意,也可以在纯 Django 中完成。 添加一个单独的 ImageQueue 模型来保存对传入图像的引用,并使用事务管理来确保同时请求不会返回相同的图像。 也许是这样的(当然,这纯粹是概念代码的证明)。

class ImageQueue(models.Model):
    image = models.OneToOne(Image)
    added = models.DateTimeField(auto_now_add=True)
    processed = models.DateTimeField(null=True, default=None)
    processed_by = models.ForeignKey(User, null=True, default=None)

    class Meta:
        order_by=('added')

...
# in the incoming image API that drone uses
def post_an_image(request):
    image = Image()
    ... whatever you do to post an image ...
    image.save()
    queue = ImageQueue.objects.create(image=image)
    ... whatever else you need to do ...

# in the API your users will use
from django.db import transaction

@transaction.atomic
def request_images(request):
    user = request.user
    num = request.POST['num'] # number of images requested
    queue_slice = ImageQueue.objects.filter(processed__isnull=True)[:num]
    for q in queue_slice:
        q.processed = datetime.datetime.now()
        q.processed_by = user
        q.save()
    return [q.image for q in queue_slice]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM