Cython多线程程序崩溃

时间:2019-06-10 01:26:15

标签: python multithreading cython

我正在编写一个程序,该程序将在后台更新某些项目,它会在以下步骤中执行该操作:

  1. 是否在最后一个小时内检查了此项?
  2. 启动一个线程在后台对其进行更新。在线程中:
  3. 下载网页并进行处理。

它通过在线程中进行此处理:

  1. 查看一些与其他程序相关的变量,
  2. 向我打招呼,看看它能走多远,
  3. 启动一个名为download_page的功能
  4. 获取download_page返回的项目,并将其提供给处理页面

在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

1 个答案:

答案 0 :(得分:1)

在这里回答我自己的问题,但是这要归功于引导我尝试的评论,我希望这对可能走类似道路的人有所帮助。

在cython中,如果线程中抛出异常,则不会向您显示该异常,只会停止工作。 我尝试了一下,然后遍历了整个函数,并且在代码的其余部分中,它告诉它在文件中写上“你把它弄坏了,虚拟的。”

您会知道什么?我弄坏了假人。

谢谢大家的帮助。