如何不卡在无限阻塞函数中?

时间:2019-04-06 12:55:18

标签: python python-multithreading blocking nonblocking

我不确定要使用的正确术语是什么。但是我的示例应该清除它。

我想听一个Reddit comment stream

此流在发布到reddit(/ r / askReddit和/ r / worldNews)时实时接收评论,因此我不必轮询服务器。

但是,此功能是 blocking (阻塞),我需要将其放入几个线程

这是我到目前为止所拥有的:

#! usr/bin/python3
from multiprocessing.dummy import Pool
import praw

def process_item(self, stream):
    # Display the comment
    for comment in stream:
        print(comment.permalink)

def get_streams(reddit):
    # Listen for comments from these two subReddits:
    streams = [
        reddit.subreddit('AskReddit').stream.comments(skip_existing=True),
        reddit.subreddit('worldnews').stream.comments(skip_existing=True)            
    ]
    pool = Pool(4)
    print('waiting for comments...')
    results = pool.map(self.process_item, streams)

    # But I want to do tons of other things down here or in `main()`.
 # The code will never reach down here because it's always listening for comments.

我只能看到的解决方法是将整个程序逻辑放入process_item()中,但这似乎很愚蠢。

我想我想process_item继续向列表中添加评论,在后台 ,然后我可以根据需要处理这些评论。但是我不必陷入process_item()

在程序执行其他操作时,程序正在执行其他操作时,列表中正在排队等待执行的工作。

可能吗?如果是这样,您能给我一些有关模式的提示吗?

我是线程技术的新手。

1 个答案:

答案 0 :(得分:0)

详细了解发布/订阅模式。 如果您想让线程使用线程模块。

多重处理是操作系统进程。进程和线程是不同的东西。如果您希望线程使用线程(当处理数据考虑GIL时)

要做任何事情:

您可以启动一些线程以从流中读取数据并将消息放入LIFO数据结构中 启动一些线程以从LIFO数据结构读取数据以处理您的数据