def push_newsfeed_to_cache(sender, instance, created, **kwargs): # 只有新建时才push, update时并不push if not created: return from newsfeeds.services import NewsFeedService NewsFeedService.push_newsfeed_to_cache(instance)
def fanout_newsfeeds_batch_task(tweet_id, follower_ids): from newsfeeds.services import NewsFeedService newsfeeds = [ NewsFeed(user_id=follower_id, tweet_id=tweet_id) for follower_id in follower_ids ] NewsFeed.objects.bulk_create(newsfeeds) for newsfeed in newsfeeds: NewsFeedService.push_newsfeed_to_cache(newsfeed) return "{} newsfeeds created".format(len(newsfeeds))
def fanout_newsfeeds_batch_task(tweet_id, follower_ids): from newsfeeds.services import NewsFeedService newsfeeds = [ NewsFeed(user_id=follower_id, tweet_id=tweet_id) for follower_id in follower_ids # notice here the tweet.user is the creator of tweet ] NewsFeed.objects.bulk_create(newsfeeds) # bulk create will not invoke post_save signal, manually push newsfeed into cache for newsfeed in newsfeeds: NewsFeedService.push_newsfeed_to_cache(newsfeed) return "{} newsfeeds created".format(len(newsfeeds))
def fanout_newsfeeds_batch_task(tweet_id, follower_ids): # import 写在里面避免循环依赖 from newsfeeds.services import NewsFeedService # 错误的方法:将数据库操作放在 for 循环里面,效率会非常低 -> # for follower_id in follower_ids: # NewsFeed.objects.create(user_id=follower_id, tweet_id=tweet_id) # 正确的方法:使用 bulk_create,会把 insert 语句合成一条 -> newsfeeds = [ NewsFeed(user_id=follower_id, tweet_id=tweet_id) for follower_id in follower_ids ] NewsFeed.objects.bulk_create(newsfeeds) # bulk create 不会触发 post_save 的 signal,所以需要手动 push 到 cache 里 for newsfeed in newsfeeds: NewsFeedService.push_newsfeed_to_cache(newsfeed) return "{} newsfeeds created".format(len(newsfeeds))
def fanout_newsfeeds_batch_task(tweet_id, follower_ids): # import written inside of method to avoid reference loop. from newsfeeds.services import NewsFeedService # wrong way: # can not put db operation in for loop. efficiency is super low and slow # for follower in FriendshipService.get_followers(tweet.user): # NewsFeed.objects.create( # user=follower, # tweet=tweet, # ) # correct way: use bulk_create, then insert once newsfeeds = [ NewsFeed(user_id=follower_id, tweet_id=tweet_id) for follower_id in follower_ids ] NewsFeed.objects.bulk_create(newsfeeds) # bulk create doesn't emit post_save signal, so, need to push each newsfeed to cache manually for newsfeed in newsfeeds: NewsFeedService.push_newsfeed_to_cache(newsfeed) return '{} newsfeeds created'.format(len(newsfeeds))
def push_newsfeed_to_cache(sender, instance, created, **kwargs): # in case we save the same feed multiple times if not created: return from newsfeeds.services import NewsFeedService NewsFeedService.push_newsfeed_to_cache(instance)