File "./test_aliyun_mac7days.py", line 26, in UploadData
writer.write(record)
File "odps/tunnel/tabletunnel/writer_c.pyx", line 251, in odps.tunnel.tabletunnel.writer_c.BaseRecordWriter.__exit__ (odps/tunnel/tabletunnel/writer_c.c:7636)
File "odps/tunnel/tabletunnel/writer_c.pyx", line 239, in odps.tunnel.tabletunnel.writer_c.BaseRecordWriter.close (odps/tunnel/tabletunnel/writer_c.c:7295)
File "/usr/local/lib/python2.7/site-packages/odps/tunnel/tabletunnel/writer.py", line 278, in close
self._req_io.finish()
File "/usr/local/lib/python2.7/site-packages/odps/tunnel/io.py", line 94, in finish
self._wait_obj.join()
File "/usr/local/lib/python2.7/threading.py", line 652, in join
raise RuntimeError("cannot join thread before it is started")
RuntimeError: cannot join thread before it is started
很奇怪,类似的代码一直在跑都没问题。已有一个进程a正在向表A传数据,今天新增了一个程序b,上传到另一个表B,进程b出现上面这个错误。用了logging 其中有这样的日志
2017-06-21 17:07:18 - Starting new HTTP connection (1): dt.odps.aliyun.com
2017-06-21 17:07:23 - "POST /projects/mac_scan/tables/xaa170621?uploads=1&curr_project=mac_scan HTTP/1.1" 201 931
2017-06-21 17:07:23 - response.status_code 201
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到这个错误RuntimeError: cannot join thread before it is started
,通常意味着在尝试等待一个线程结束(thread.join()
)之前,该线程还没有被启动。在您的场景中,这可能与阿里云MaxCompute(原名ODPS)的Python SDK使用不当有关,特别是在并发上传数据到不同表的操作中。
这里有几个可能的原因和解决办法:
并发写入冲突:如果两个进程尝试同时写入不同的表,理论上它们应该是独立操作,但如果它们共享了某些资源(如网络连接池、全局变量等),可能会导致意外的竞态条件。确保每个进程实例化自己的ODPS客户端和TableTunnel对象,避免资源共享。
SDK版本或配置问题:确认您使用的pyodps
库是最新版本或者至少是兼容当前阿里云MaxCompute服务的版本。有时候旧版本的SDK可能无法正确处理并发场景下的某些逻辑。可以通过pip show pyodps
查看版本,并通过pip install --upgrade pyodps
进行升级。
异常处理不当:在您的日志中,看到有HTTP请求的记录,但没有直接显示与错误相关的HTTP响应状态或详细信息。确保在写入数据时有充分的异常处理逻辑,比如重试机制,以及在写入失败时能够正确关闭和清理资源。
线程管理问题:检查您的代码中是否正确初始化并启动了所有线程。确保在调用join()
之前,线程已经被明确地启动(start()
方法被调用)。如果是在多进程环境下,还需注意进程间的通信和资源同步问题。
资源限制:检查是否有系统级别的资源限制,比如文件描述符的数量、网络连接数限制等,这些也可能间接导致线程无法正常启动或执行。
建议的解决步骤: - 首先,检查并确保每个上传任务都是独立的,不共享关键资源。 - 更新pyodps
到最新版本。 - 在代码中增加详细的日志记录,特别是对线程创建、启动、结束的记录,以及所有网络请求的响应状态码和消息。 - 实施异常处理逻辑,包括重试策略,以增强代码的健壮性。 - 如果问题依旧,考虑联系阿里云技术支持,提供详细的错误日志和复现步骤,以便获得更专业的帮助。