簡體   English   中英

排隊大量的芹菜任務

[英]Queuing large number of celery tasks

我正在使用Celery分布式任務調度庫編寫python3應用程序。 工人正在使用greenlet線程進行處理。 任務是與網絡操作相關的I / O.

我需要將大量芹菜任務作為單個組插入。 在這種情況下,它一次大約10000(10k)url,每個作為單獨的芹菜任務。

這種插入為單一組,在localhost上運行redis或rabbitmq需要大約12秒。 哪個太長了。

問:有沒有辦法用芹菜來優化這種大量插入?

在其他線程中,我發現人們不喜歡使用塊,但是當我以塊的形式提交它時 - 單個塊正在單線程中處理(不使用greenlet,這是必要的,因為在工作者操作上阻塞了IO)。 這導致性能下降。 考慮以下數字:

  1. 無塊:插入12秒,處理9秒。
  2. 使用塊:插入3秒,處理27秒。

因此,使用塊是不可能的,因為阻塞網絡操作將破壞greenlet線程的性能優勢。

soa = open('input.txt').readlines()
for line in soa:
    line = line.strip()
    s = line.split(':')
    l.append(check.s(s[0], s[1]))
    #l.append(s)
t = time.time()

res = check.chunks(l, 10)()
#print(res.get())
print("Submission taken %f" % (time.time() - t))

exit()

Chunks結果:提交時間為2.251796秒

l = []

soa = open('input.txt').readlines()

for line in soa:
    line = line.strip()
    s = line.split(':')
    l.append(s)

job = group(l)
t = time.time()
result = job.apply_async()
print("Submission taken %f" % (time.time() - t))

常規結果:提交時間為12.54412秒

Celery字面上有一個名為Group and Chunk的任務包裝器。

https://docs.celeryproject.org/en/latest/userguide/canvas.html

我認為Chunk需要一個結果后端,但是只需將您的任務分成50到200個URL組,就可以讓Celery為您進行優化。

但是,如果您正在執行10000個網絡綁定任務,那么它將需要一秒鍾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM