Python中文
首页
教程
问答
标签
搜索
登录
注册
Python tempfile模块和线程表现不佳;我做错了什么?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>在Python中,线程和tempfile模块有一个有趣的问题。在线程退出之前,某些东西似乎不会被清理干净,而我正在违反打开文件的限制。(这是在OS X 10.5.8和Python 2.5.1上安装的。)</p> <p>但是如果我复制tempfile模块正在做的事情(不是所有的安全检查,而是生成一个文件描述符,然后使用os.fdopen操作系统产生一个文件对象)我没有问题。在</p> <p>在把它作为一个bug提交给Python之前,我想我应该在这里检查一下,因为很可能我做了一些微妙的错误。但如果我是的话,一天的努力也没有让我有任何收获。在</p> <pre><code>#!/usr/bin/python import threading import thread import tempfile import os import time import sys NUM_THREADS = 10000 def worker_tempfile(): tempfd, tempfn = tempfile.mkstemp() tempobj = os.fdopen(tempfd, 'wb') tempobj.write('hello, world') tempobj.close() os.remove(tempfn) time.sleep(10) def worker_notempfile(index): tempfn = str(index) + '.txt' # The values I'm passing os.open may be different than tempfile.mkstemp # uses, but it works this way as does using the open() function to create # a file object directly. tempfd = os.open(tempfn, os.O_EXCL | os.O_CREAT | os.O_TRUNC | os.O_RDWR) tempobj = os.fdopen(tempfd, 'wb') tempobj.write('hello, world') tempobj.close() os.remove(tempfn) time.sleep(10) def main(): for count in range(NUM_THREADS): if count % 100 == 0: print('Opening thread %s' % count) wthread = threading.Thread(target=worker_tempfile) #wthread = threading.Thread(target=worker_notempfile, args=(count,)) started = False while not started: try: wthread.start() started = True except thread.error: print('failed starting thread %s; sleeping' % count) time.sleep(3) if __name__ == '__main__': main() </code></pre> <p>如果我在<code>worker_notempfile</code>行处于活动状态并且<code>worker_tempfile</code>行被注释掉的情况下运行它,它将运行到完成状态。在</p> <p>另一种方法(使用<code>worker_tempfile</code>)得到以下错误:</p> ^{pr2}$ <p>你知道我做错了什么吗?这是Python中的一个bug,还是我有点头晕目眩?在</p> <p><strong>更新2009年12月14日:</strong> 我想我找到了答案,但我不喜欢。因为没人能复制这个问题,我就到处找机器。除了我的机器什么都没用。我在一台Mac电脑上测试了我使用的软件版本。我甚至去寻找一个桌面G5,它的硬件和软件配置和我完全一样——结果是一样的。两个测试(有tempfile和没有tempfile)都成功了。在</p> <p>为了获得成功,我下载了Python2.6.4,并在桌面上进行了尝试,在我的系统上使用了与Python2.5.1相同的模式:tempfile失败,notempfile成功。在</p> <p>这让我得出结论:我的Mac电脑上有东西,但我肯定搞不清是什么。欢迎提出任何建议。在</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>我想你的答案可以找到。您必须显式地<code>os.close()</code>作为<code>mkstemp</code>提供的元组的第一部分给出的文件描述符。在</p> <p>编辑:不,手术室已经在做该做的事了。我把答案留到好的链接上。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何添加虚拟方法
10 回答
如何添加表示整数的擦边字符串?
2 回答
如何添加要在Bokeh中使用的新font.ttf文件?
4 回答
如何添加要显示的矩阵XY轴编号和XY轴
4 回答
如何添加计数?
6 回答
如何添加计数器函数?
1 回答
如何添加计数器列来计算数据帧中另一列中的特定值?
4 回答
如何添加计数器来跟踪while循环中的月份和年份?
3 回答
如何添加计数并删除countplot的顶部和右侧脊椎?
4 回答
如何添加计时器wx.应用程序更新窗口对象的主循环?
4 回答
如何添加评论到帖子?PostDetailVew,Django 2.1.5
8 回答
如何添加评论拉梅尔亚姆
10 回答
如何添加诸如矩阵Python/Pandas之类的数据帧?
3 回答
如何添加谷歌地点自动完成到Flask?
8 回答
如何添加超时、python discord bot
7 回答
如何添加超过1dp的检查
7 回答
如何添加距离方法
4 回答
如何添加跟随游戏的敌人精灵
1 回答
如何添加路径以便python可以找到程序?
6 回答
如何添加身份验证/安全性以使用happybase访问HBase?
10 回答