Как не застрять в бесконечно блокирующей функции? - PullRequest
0 голосов
/ 06 апреля 2019

Я не уверен, какую правильную терминологию использовать. Но мой пример должен прояснить ситуацию.

Я хочу прослушать поток комментариев Reddit .

Этот поток получает комментарий в режиме реального времени, когда он публикуется в reddit (/ r / askReddit и / r / worldNews), поэтому мне не нужно опрашивать сервер.

Однако эта функция блокирует , мне нужно поместить ее в несколько потоков .

Вот что у меня есть:

#! 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 голосов
/ 06 апреля 2019

Узнайте больше о паб / суб шаблон.если вам нужен поток, используйте модуль потоков.

многопроцессорная обработка - это процесс.Процесс и темы это разные вещи.Если вы хотите, чтобы потоки использовали многопоточность (когда данные процесса думают о GIL)

, чтобы сделать что-либо, что:

, вы можете запустить несколько потоков, чтобы прочитать данные из потока и поместить сообщение в структуру данных LIFO, чтобы начатьпотоки для чтения данных из структуры данных LIFO для обработки ваших данных

...