我有一个代码库,我正在寻找拆分并使用线程添加,但是我对如何处理它相对较新。请在进一步阅读之前尊重我的愿望,不要只是重新编写这段代码,然后将问题解决了。我宁愿用指向正确方向的人解决问题,而不是为我解决问题;我不是那么学习。
功能齐全的代码库是here - 它需要可以通过easy_install安装的机械化和美化库。
我已将我的所有函数分离出来,并尽量保持代码尽可能干净(我确信在那里有一些优化,我会得到扩展,但主要问题是如何线程化此
我的最终目标是将其打包成一个线程,然后在其他初始化的浏览器对象之间共享cookie,以便在原始代码运行“后台”时执行其他操作。
我试过这样:
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之后,这是对我遇到的问题的再现。
答案 0 :(得分:3)
只要你有一个单独的线程(如上面的代码片段,你只需要实例化Recon
一次),那么你在哪里做什么并不重要;但是我当然想象你引入线程的原因是最终会让多个线程处于活动状态。
如果是这种情况,那么第一个关键问题是确保您永远不会有两个或多个线程同时尝试使用相同的共享系统/资源 - 例如,多个线程同时写入{{1在你提到的pastebin URL代码的情况下。
避免此类问题的经典方法是使用锁定,但我最喜欢的方式是完全不同的:确保只有一个专用线程访问任何此类资源,并使用Queue.Queue实例(本质线程安全)来使用其他线程将工作请求发送到专用线程(因此,不是直接写入ReconFile,而是每个其他线程都会创建一个连续写入的行列表,然后ReconFile
队列中的列表,其中“recon file writing”worker线程正在等待.put
)。
当您需要从此类操作中获取结果时(此处不是这种情况),请求线程会将其自己的个人“队列返回结果”作为其向工作人员提供的“工作请求数据包”的一部分线程的队列。我在第二版“Python in a Nutshell”的线程章节中介绍了这个推荐架构的更多细节(为什么,作为本书的作者,我当然不会推荐你执行非法行为下载我的书的免费盗版副本,但我可以提到有很多网站提供这样的盗版副本供下载 - 免费阅读我的书的合法方式是报名参加O'Reilly的{{3在线图书网站)。
这并没有解决您正在观察的具体问题,因为当您只有一个线程时就会发生这种情况。我注意到线程正在尝试在标准输入和标准输出上执行大量I / O,这可能是线程中的问题 - 考虑在开始之前执行线程的输入(在线程中)主线程)和所需输出使用Python的标准.get
模块, 保证是线程安全的。你还在观察问题吗?如果是这种情况,那么下一步就是通过logging
调用对您的代码进行调整,以便您可以确切地指出它停止的位置 - 然后告诉我们,我们可以尝试从那里开始帮助!