Поделиться модулем между процессами - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть программа, которая запускает tweepy streamListener, который добавляет новые твиты в базу данных и запускает другой процесс, который отслеживает в указанной базе данных твиты старше X и что-то с ними делает.

Приведенный ниже код структурно аналогичен, только без кода взаимодействия с базой данных, поскольку это не то, что вызывает мою проблему.

Насколько я понимаю, проблема в том, что вы не можете делиться модулями Python, которые содержат какое-то состояние между различными процессами.

Как мне обойти это? Мне нужно, чтобы оба процесса имели доступ к tweepy для твиттер-взаимодействия.

Любая помощь или идеи очень ценятся!

import multiprocessing
import time
import tweepy

class App():
    def __init__(self):
        keys = {
            "consumer_key": "",
            "consumer_secret": "",
            "access_token": "",
            "access_token_secret": ""
        }

        auth = tweepy.OAuthHandler(keys['consumer_key'], keys['consumer_secret'])
        auth.set_access_token(keys['access_token'], keys['access_token_secret'])

        self.api = tweepy.API(auth)

        self.worker = Worker(self.api)

    def run(self):
        self.worker.start()

        myStreamListener = MyStreamListener()
        stream = tweepy.Stream(auth=self.api.auth, listener=myStreamListener)
        stream.filter(track=['python'], async=True)

class Worker(multiprocessing.Process):
    def __init__(self, api):
        multiprocessing.Process.__init__(self)

        self.api = api

    def run(self):
        # Filler for debugging purposes
        print(self.api.me(), flush=True)
        time.sleep(1)

class MyStreamListener(tweepy.StreamListener):
    def on_status(self, status):
        # Filler for debugging purposes
        print(status.text, flush=True)

if __name__ == "__main__":
    APP = App()
    APP.run()

Запуск этого приводит к следующей ошибке

Traceback (most recent call last):
  File "[PATH_REMOVED]", line 46, in <module>
    APP.run()
  File "[PATH_REMOVED]", line 22, in run
    self.worker.start()
  File "E:\Programs\Python 3.x\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "E:\Programs\Python 3.x\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "E:\Programs\Python 3.x\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "E:\Programs\Python 3.x\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "E:\Programs\Python 3.x\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle module objects
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "E:\Programs\Python 3.x\lib\multiprocessing\spawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "E:\Programs\Python 3.x\lib\multiprocessing\reduction.py", line 87, in steal_handle
    _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE)
PermissionError: [WinError 5] Access is denied
...