我正在编写一个程序,该程序将在后台更新某些项目,它会在以下步骤中执行该操作:
它通过在线程中进行此处理:
在download_page和process_page的顶部,我还放置了打印语句,以查看它是否到达那里。
因此,我的问题是: 在python中,它可以正常工作。 但是,在我将其cythonise之后,它进入了打印语句,它执行得很好,然后下一行是使用url作为参数启动download_page。 download_page的第一行是print语句。 接受实际上永远不会发生的事情。它不会显示错误,不会打印,就像它只是放弃一样。
我已经使用普通的python检查了代码,并且运行正常。 让人讨厌的是,它与urllib崩溃,因此我转到了请求,以为可能是这样,但是在添加了print语句之后,download_page顶部的那个甚至没有启动... 我只是不确定出什么问题。
作为参考,我在下面附加了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
答案 0 :(得分:1)
在这里回答我自己的问题,但是这要归功于引导我尝试的评论,我希望这对可能走类似道路的人有所帮助。
在cython中,如果线程中抛出异常,则不会向您显示该异常,只会停止工作。 我尝试了一下,然后遍历了整个函数,并且在代码的其余部分中,它告诉它在文件中写上“你把它弄坏了,虚拟的。”
您会知道什么?我弄坏了假人。
谢谢大家的帮助。