首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理进程在PyCharm中永久锁定

多处理进程在PyCharm中永久锁定
EN

Stack Overflow用户
提问于 2017-11-13 14:49:13
回答 1查看 1.2K关注 0票数 4

多处理库永久锁定所创建的PyCharm和subprocesses,我遇到了一个奇怪的问题。我使用Windows和Python3.5。我想做的是:

  1. 启动后台线程以阻止stdin (等待输入)
  2. 让主线程偶尔检查stdin的输入,然后将工作委托给使用多处理创建的Python进程。

但是,我发现新创建的多处理进程在满足以下条件的情况下才会永久锁定:

  1. 我正在通过Pycharm (最新版本和旧版本)运行代码。
  2. 后台线程正在stdin上阻塞。

下面是我可以创建的最简单的再现问题的示例:

代码语言:javascript
复制
import multiprocessing
import threading
import sys


def noop():
    pass


def consume():
    while True:
        sys.stdin.readline()


if __name__ == '__main__':
    # create a daemon thread to block on stdin
    thread = threading.Thread(target=consume, daemon=True)
    thread.start()

    # create a background process
    process = multiprocessing.Process(target=noop)
    process.start()

我搜索了"PyCharm stdin多处理挂“的各种组合.我不知道为什么stdin上阻塞主进程的线程也会导致subprocess阻塞/挂起,更不用说为什么只有在PyCharm中运行脚本时才会发生这种情况。我唯一能猜到的是,可能会有一些stdin或多进程库的猴子补丁正在进行。

还有其他人遇到过这个问题吗?有人能向我解释为什么这只发生在PyCharm中,以及我如何使它工作,而不管我使用的是哪个Python编辑器?

EN

回答 1

Stack Overflow用户

发布于 2018-04-16 14:44:06

当我试图执行多个API调用从远程服务器获取数据时,我也遇到了同样的问题。我用ThreadPoolExecutor替换了多处理假人。它的工作方式和假人一样。

下面是正在运行的代码的简短片段,用于将响应写入json文件:

代码语言:javascript
复制
    uids = [] # an array of the requisite parameters used in requests
    with open('flight_config.json', 'w') as f:
    futures = []
    for i in range(chunk_index, len(uids)):
        print('For uid[{}], fetching started:'.format(i))
        chunk_index += 1
        auth_token = get_header()
        with ThreadPoolExecutor(max_workers=7) as executor:
            future_to_url = {executor.submit(fetch_response_from_api, uid=uid, auth_token=auth_token): uid for uid in
                             uids[i]}
            for future in concurrent.futures.as_completed(future_to_url):
                result = future_to_url[future]
                try:
                    data = future.result()
                    print(data)
                except Exception as exc:
                    print('%r generated an exception: %s' % (result, exc))
                else:
                    print('%r page is %d bytes' % (result, len(data)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47267077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档