我有一个代码库,我正在寻找拆分并添加到使用线程,但我是如何处理它相对较新。请在阅读进一步的尊重之前,我不希望重写这段代码,并在问题解决后将其抛回给我。我更愿意把某个人指向正确的方向,而不是为我解决问题。我没有很好地学习。将python程序转换为线程应用程序的过程?
全功能代码库为here - 它需要通过easy_install安装的mechanize和beautifulsoup库。
我把所有的函数都分开了,并尽量保持代码尽可能干净(我确信在那里有一些优化,我会得到扩展,但主要问题是如何线穿过这个。
我的最终目标是要打包成一个线程这一点,然后共享其他浏览器初始化对象之间的cookies为了做其他的事情,而我原来的代码运行“中背景”。
我已经如此尝试:
class Recon(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
#Packed the stuff above my original while loop in here, minus functions.
def run(self):
#Packed my code past the while loop in here.
somevar = Recon()
somevar.start()
问题我遇到的是,一旦我运行该程序,它将运行init中的内容,但之后它只是坐在那里冻结在我身上。没有追踪,没有错误,只是没有做任何事情,甚至不会将我的命令提示返回到我的控制。
我可以只是得到一些提示,或者如何转换的一般流程?我感到不知所措,并删除了我正在尝试的代码,所以我没有这个例子,但是我需要预先加入“自我”。我所有的变数?我需要将我的变量定义为全局吗?
这是我在尝试将脚本转换为使用threading后遇到的问题的复制。
你所有的假设都是正确的;我正在尝试引入线程,为将来只能共享列表和cookiejar对象的代码做准备。我的想法是,我将用一个线程来抓取数据,并在另一个线程中处理该数据(但被访问的数据将永远不会被同时访问) 如果我调用init,并运行...如果我的init正在调用原始输入,Python会在等待init输入时运行我的run函数吗?或者init是否必须先完成? – ThantiK 2010-02-28 04:39:19
@ThantiK,Python中的所有I/O函数“放弃GIL”(全局解释器锁),以便其他线程(使用CPU任务而不是I/O)可以接管。但是线程子类的'__init__'运行在实例化它的线程中(主线程在正常情况下,特别是在你的情况下) - 新线程只在'start'方法调用时产生,它是什么运行只是“运行”方法。 – 2010-02-28 05:03:57
这是我的转换的结果,SEEMS现在工作正常:http://pastebin.com/Pb582aF3任何帮助使它更清洁或任何批评是受欢迎的;) – ThantiK 2010-02-28 05:06:03