Сбой многопоточной программы Cython - PullRequest
0 голосов
/ 10 июня 2019

Я пишу программу, которая будет обновлять определенные элементы в фоновом режиме, она делает это в следующих шагах:

  1. Был ли этот пункт проверен в течение последнего часа, если нет:
  2. Запустите поток, чтобы обновить его в фоновом режиме.В потоке:
  3. загрузите веб-страницу и обработайте ее.

Эта обработка выполняется в потоке:

  1. , глядя на некоторыепеременные для других программных вещей,
  2. печать привета мне, чтобы посмотреть, как далеко он продвинулся,
  3. запуск функции с именем download_page,
  4. , принимающий элемент, возвращенный download_pageи предоставив его для обработки страницы

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

Проблема, с которой я столкнулсятак: в питоне все работает нормально.Однако, после того, как я его зацифровал, он доходит до оператора print, он прекрасно справляется с этой задачей, затем следующей строкой является запуск download_page с URL-адресом в качестве аргумента.Первая строка страницы загрузки - это оператор печати.Примите это на самом деле никогда не происходит.Он не отображает ошибку, не печатает, он как бы просто сдается.

Я проверил код, используя обычный python, и он работает нормально.То, что изначально привело меня к этому, было то, что он зависал с urllib, поэтому я перешел к запросам, думая, что это могло быть так, но потом после добавления в операторы печати, и тот, что в верхней части страницы загрузки, даже не запускался ...Я просто не уверен, что происходит не так.

Для справки, я прикрепил файл компиляции Cython ниже:

import setuptools

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension("rss",  ["rss.py"], extra_compile_args=['/openmp']),
#   ... all your modules that need be compiled ...
]

setup(
    name = 'RSS',
    cmdclass = {'build_ext': build_ext},
    ext_modules = ext_modules
)

Редактировать: Дополнительный код из программы:

globals.py:

pages={} # this stores loaded pages
pageurl=0 # what url to check
unseen=[] # pages that have been updated and not yet viewed

main file:
import globals as g
import threading
import requests
def updatepage():
 if(threading.activeCount()>10):
  return;  # don't overload CPU's
 print 'Hi, I am working' # did it get this far? In tests, it does.

 thread1=threading.Thread(target = loadpage, args = [g.pageurl])

 thread1.start()

def loadpage(url):
   if(g.pages.has_key(url)==False):
    g.feeds[url]={'feed': 0, 'checklimit': 7200, 'unseen': [], 'last_check': 0}

   oldpage=g.pages[url]

   print 'I am right here, just about to download' # another check statement, which works

   fi=download_page(url)

   # code below this point not related, as it never gets here

def download_page(url):

 print url # it never does that

 r = requests.get(url, allow_redirects=True)

 print 'return step' # this never happens

 return r.content

1 Ответ

1 голос
/ 11 июня 2019

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

В cython, если исключение выдается в потоке, оно не будет показываться вам и просто перестанет работать. Я попытался, но только вокруг всей функции, и в части кода, за исключением, сказал ему записать в файл слова «Ты сломал это, пустышка».

Что бы вы знали? Я сломал его. Пустышка.

Спасибо всем за помощь.

...