teradatasql:runtime/cgo:无法获取 pthread_keys

teradatasql: runtime/cgo: could not obtain pthread_keys

当我尝试从 sqlalchemy df=pd.read_sql_table(table, con, schema) 读取数据时出现运行时错误:

runtime/cgo: 无法获取 pthread_keys tried 0x115 0x116 0x117 0x118 0x119 0x11a 0x11b 0x11c 0x11d 0x11e 0x11f 0x120 0x121 0x122 0x123 0x124 0x125 0x126 0x127 0x128 0x129 0x12a 0x12b 0x12c 0x12d 0x12e 0x12f 0x130 0x131 0x132 0x133 0x134 0x135 0x136 0x137 0x138 0x139 0x13a 0x13b 0x13c 0x13d 0x13e 0x13f 0x140 0x141 0x142 0x143 0x144 0x145 0x146 0x147 0x148 0x149 0x14a 0x14b 0x14c 0x14d 0x14e 0x14f 0x150 0x151 0x152 0x153 0x154 0x155 0x156 0x157 0x158 0x159 0x15a 0x15b 0x15c 0x15d 0x15e 0x15f 0x160 0x161 0x162 0x163 0x164 0x165 0x166 0x167 0x168 0x169 0x16a 0x16b 0x16c 0x16d 0x16e 0x16f 0x170 0x171 0x172 0x173 0x174 0x175 0x176 0x177 0x178 0x179 0x17a 0x17b 0x17c 0x17d 0x17e 0x17f 0x180 0x181 0x182 0x183 0x184 0x185 0x186 0x187 0x188 0x189 0x18a 0x18b 0x18c 0x18d 0x18e 0x18f 0x190 0x191 0x192 0x193 0x194

代码如下:

class TeradataWriter:

    def __init__(self):
        print("in init")


    def read_data_from_teradata(self):
        try:
            print('Create  main')
            import pdb;pdb.set_trace()
            eng = self.create_connection_engine()

            df = pd.read_sql_table("table_name", eng, schema="schema")

            print(df)
        except Exception as ex:
            print('Exception: %s', ex.with_traceback())

    def create_connection_engine(self):

        try:
            return create_engine('teradatasql://' + constants.TERADATA_HOST + '/?user='+ constants.TERADATA_USER_NAME + '&password=' + constants.TERADATA_PWD, echo=False)
        except Exception as ex:
            LOGGER.error('Exception: %s', ex)
            raise Exception(message_constants.ERROR_WHILE_CREATING_CONNECTION_WITH_TERADATA)


if __name__ == "__main__":
    p = TeradataWriter()

    p.write_dataframe_to_teradata()

我 运行 遇到了同样的问题 - 所以为了解决这个问题,我将 connect 语句移动到 main 并且它有点固定。在你的情况下值得一试。

编辑:已修复。我终于能够得到他们的支持和工程团队来重现这个问题。他们现在使用更新版本的 go 构建驱动程序。升级到 >= 17.0.3,你应该不会再看到段错误了。

我想我终于明白为什么会这样了。根据此 Go issue,如果“如果主机进程在加载共享库之前生成线程,则偏移量将发生变化。”

就我而言,在调用加载共享库的代码之前,我在 IPython 中导入了 matplotlib.pyplot。这 starts an event loop 并导致导致段错误的条件。

配置 teradata 驱动程序后,我更改了我的代码以导入 matplotlib.pyplot,但它消失了。

根据 Go 问题,他们只需要用更新版本的 Go 重新编译库,这是我要求他们做的。我们看看他们怎么说。