У меня есть программа, которая запускает 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