我认为标题很清楚. 解决方案 虽然您无法从PHP代码产生线程,但您可以将PHP与多线程Web服务器一起使用,该Web服务器处理在不同线程上的并发请求.在这种情况下,应使用PHP的TS(线程安全)版本. PHP的TS版本将每个请求的状态保持在其自己的内存位置.这是必要的,因为多线程服务器中的所有请求共享相同的地址空间. 替代方法是使用多进程(通常是预叉)服务器.使用这样的服务器,某些状态可以将其保存在全局变量中,而不会影响并发请求.这就是实现PHP的NTS(非线程安全)版本的方式.
以下是关于 thread-safety 的编程技术问答
我有一些记录的mysql表,例如: CREATE TABLE test ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, value varchar NOT NULL ) 现在,我需要的是生成php脚本中的1、2,...,n的唯一序列,然后存储到另一个表中...如何实现这一目标以成为线程安全,而不是创建双打或跳过某些东西? 我想知道是否有一些其他mysql表可能会有所帮助,但是我不知道如何创建诸如"每个列值的独立自动插入"之类的东西或其他任何东西... test: 1 ... apples 2 ... oranges 3 ... lemons 一些PHP脚本(当时由多个用户访问): save_next_fruit($_GET['fruit']); 将在其他表格中创建一些记录,具有这样的值: saved_fruit: ID | FRUIT(FK) | FRUIT_NO 1 1
php的pcntl_fork函数应该作为C. 中的标准叉函数分叉一个过程 但是我想知道这个功能是否真的为过程提供了,还是以不同的方式模拟该行为. 如果它确实为该过程提供了,那么很明显哪个过程是:Apache的子过程之一. 只要Apache使用Prefork MPM(即每个请求一个过程). 但是,如果Apache使用工人MPM? 会发生什么 使用工人MPM时,每个Apache子进程都包含许多线程,每个线程都处理不同的HTTP请求.因此,如果您在这种情况下分配过程,我什至不认为所有这些线程和请求会发生什么. 因此,如果PCNTL_FORK()确实分叉了该过程,那么我认为如果将Apache设置为使用Worker mpm,则使用此功能不是一个好主意. 专家怎么说?我的理由是很好,还是我只是在说话? 解决方案 pcntl_fork 可能会按照您的想法进行工作:它会以当前的过程为例,相同C功能叉的方式: pcntl_fork()函数创建一个 儿童过程与 父母仅在其pi
我如何找出已安装的PHP版本是否为线程安全? 请注意,我不是在问螺纹安全/非线程安全安装之间的区别.我想找出当前安装的内容. 解决方案 打开一个phpinfo()并搜索线线程安全.对于线程安全构建,您应该找到 enable . 如 Muhammad Gelbana 您也可以使用: 在Windows上:php -i|findstr "Thread" 在 *nix上:php -i|grep Thread 其他解决方案 如果您喜欢使用命令行: *nix: php -i | grep -i "Thread" Windows: php -i | findstr -i "thread" 这应该给你这样的东西: Thread Safety => enabled 或 Thread Safety => disabled 其他解决方案 我发现更容易查看PHP根文件夹中名为php [version] .dll的文件.其php
是Linux/Unix上的PHP(从5.2起)螺纹安全? 可以将其与Apache Worker-MPM或Event-MPM一起使用? 到目前为止我收集的事实尚无定论: 大多数发行版中包含的默认二进制文件已禁用ZTS,所以我知道我必须重新编译它们. 在理论上,启用ZTS的Zend Engine(Core PHP)是线程安全. 据说某些模块可能不是线程安全的,但是我没有找到任何一个或没有的模块列表. php faq 如上. 您的经验是什么? 不仅涉及分段故障(Windows incenclature中的"访问违规"). 线程安全. 解决方案 我知道getText和 set_locale 不是线程. php不应与螺纹MPM一起使用. - 安全. 运行php noted php . 其他解决方案 请参阅 其他解决方案 可能是一个更好的问题:"如果使用MPM,以下PHP代码会触发访问违规吗?"或者,"您是否经历了使用以下功能归因于并发问题的奇怪
我看到了PHP的不同二进制文件,例如非线程或线程安全? 这是什么意思? 这些软件包有什么区别? 解决方案 需要进行并发方法的背景: 不同的Web服务器实施了不同的技术来并行处理传入的HTTP请求.一种非常受欢迎的技术是使用线程 - 也就是说,Web服务器将为每个传入请求创建/专用一个线程. Apache HTTP Web服务器支持用于处理请求的多个模型,其中一个(称为Worker MPM)使用线程.但是它支持另一个称为Prefork MPM的并发模型,该模型使用流程 - 也就是说,Web服务器将为每个请求创建/专用一个过程. 还有其他完全不同的并发模型(使用异步套件和I/O),以及将两个或三个模型混合在一起的模型.为了回答这个问题,我们仅关注上面的两个模型,并以Apache HTTP服务器为例. 需要关于PHP如何与Web服务器"集成"的背景: php本身没有响应实际的HTTP请求 - 这是Web服务器的工作.因此,我们将Web服务器配置为将请
是否有一种方法可以在不编辑实体对象的情况下更改单个方法上的JPA提取类型? 我有一个由JPA实体类组成的共享ORM层.该ORM层由两个DAO层访问.一个dao需要懒惰的获取,就像我的Web应用程序一样,另一个需要急切的获取,因为我需要它是螺纹安全. 这是我的threadsafe dao中的示例方法, @PersistenceContext(unitName = "PersistenceUnit", type = PersistenceContextType.TRANSACTION) private EntityManager em; public ErrorCode findErrorCodeById(short id) { return (ErrorCode) em.createNamedQuery("ErrorCode.findById"). setParameter("id", id).getSingleResult(); }
核心perl函数rand()不是螺纹安全,我需要螺纹蒙特卡洛模拟中的随机数. 我在各种随机数发电机上找到(如果有的话)是线程安全的,在CPAN中找到任何注释,而我确实每次Google搜索都会对C/C ++/Python/notings感到困惑但是perl.有什么建议吗? 解决方案 在Windows上不使用内置rand用于蒙特卡洛.至少,尝试: my %r = map { rand() => undef } 1 .. 1_000_000; print scalar keys %r, "\n"; 如果什么都没有改变,它应该打印32768它绝对不适合任何类型的认真工作.而且,即使它确实打印了更大的数字,也最好坚持使用具有已知良好素质的PRNG. 您可以使用 MATH :: random :: Math . 您可以使用自己的种子数组在每个线程中实例化新的Math::Random::MT对象. Mersenne Twister 具有模拟的良好属性. 其他解
我正在使用以下子例程运行40或SO线程: my $app = shift; my $ua = LWP::UserAgent->new(); $ua->timeout(5); my $response = $ua->get($$app{'watch_url'}); my $new_md5; if ($response->is_success()) { $new_md5 = md5_hex($response->content()); } return ($$app{'short_name'}, $$app{'watch_md5'}, $new_md5); 核心转储的时间大约为3/4. LWP和LWP :: Useragent是纯Perl,因此我措手不及. LWP :: Useragent不螺纹安全吗? 更新: 这是重现问题的最小版本: use strict; use warnings; use threads; use LWP::UserAgent;
我必须在文件中写入彩票产生的所有可能组合.示例: 0 0 0 0 0 0(第一个组合) 0 0 0 0 0 1(第二组合) 0 0 0 0 0 2 . . . 最后的. 38 38 38 38 38 38(最后组合) 在我的主类中,我只使用一个线程,因为我不知道如何使用更多线程来更快地写入文件. 为生成我使用的数字,我使用6个循环,一个在另一个内部使用: import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.Scanner; public class Proceso extends Thread {
java类 此类是线程安全:多个线程可以共享一个单个属性对象而无需外部同步. 由于这个原因,我有习惯在HashMap实现Map的实现中,这不是线程安全,而是更轻巧.更具体地说,实现线程安全需要其他锁定机制,这将对性能产生影响.我可以通过简单地将我的属性初始化在静态类初始化器中隔离来轻松避免这种情况,这将确保在我在同一类的实例方法中使用任何get呼叫之前的完成. 到目前为止,这只是一个叙事,它使我谈到了实际问题.最终,我需要恢复只能接受"属性"作为参数的API,一个示例为 DriverManager.getConnection(String,Properties) .我需要将我的Map转换为Properties. 所以第一次尝试看起来像这样: Properties properties = new Properties(); this.propertyMap.forEach((k,v)->{properties.setProperty(k, v);});
我打算设计一个类,以将函数的执行限制为指定时间内的给定金额,例如: 过程最大1秒的5个文件 应该是线程安全的,性能命中应很小. 您将如何设计这样的课程?我有几个想法,但它们似乎对我来说都不是对的. 是否有任何已知的设计模式? (我正在编码.net,但任何语言都可以) 从外部班级应该这样起作用(假设它是singleton ): 设置: Limiter.Instance.MaxExecutionPerSecond = 5 然后,我们在执行函数之前将其调用在线程中,如果需要,则它会阻止线程: Limiter.Instance.WaitIfRequired() 解决方案 类似的东西? using Timer = System.Threading.Timer; class Limiter{ public static readonly Limiter Instance = new Limiter(); Limite
同时使用不同线程的许多开放连接有任何问题? 我默认情况下从我阅读的内容中可以安全地安全,但是,这会损害性能而不是改进吗? 解决方案 具有多个连接不是问题,唯一要记住的是SQLite不支持多个写入交易的并发.来自SQLite site : sqlite支持无限数量的同时读者,但它只能及时允许一位作家及时.对于许多情况,这不是问题.作家排队.每个应用程序的数据库可以迅速工作并继续前进,并且无锁持续数十几毫秒.但是有些应用需要更多的并发性,这些应用程序可能需要寻求其他解决方案. sqlite是一个"非典型"数据库管理系统:实际上,它是一个提供SQL作为语言的库来访问简单的"数据库中的数据库",以及其他一些DBMS功能.例如,它没有真正的并发控制(它使用操作系统功能锁定数据库文件). 因此,如果您需要同时插入数据库中,则应使用其他内容,例如 postgresql . 其他解决方案 document 说: 只能从创建它的线程中使用连接. 在线程之间移动
我正在使用768MB RAM运行CentOS 5.5.我在日志中不断获得server reached MaxClients setting, consider raising the MaxClients setting,Apache运行的运行速度也很慢.当我查看仙人掌图时,它显示服务器甚至没有使用所有资源.这是当前的配置 StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 1024 MaxClients 768 MaxRequestsPerChild 4000 StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75
我试图为我的班级使用构建器图案. 下面是我的建筑商课程,我通过在有效Java(第二版)中显示的Joshua Bloch版本来构建.我们的客户将始终通过userId>始终通过userId>,但其他字段是可选的,他们可能会或可能不会通过.这里的偏好是一个有四个字段的枚举类. public final class InputKeys { private long userid; private long clientid; private long timeout = 500L; private Preference pref; private boolean debug; private Map parameterMap; private InputKeys(Builder builder) { this.userid = builder.userId; t
对于c/c ++,是 pcre 库螺纹shet-safe吗? 如果PCRE是线程安全的,性能是否有问题? 解决方案 从 pcre 文档文档 多线程 PCRE函数可用于多线程应用程序 内存管理功能指向的附加条件 PCRE_MALLOC,PCRE_FREE,PCRE_STACK_MALLOC和PCRE_STACK_FREE,以及 标注和堆栈检查功能由pcre_callout指向和 PCRE_STACK_GUARD,所有线程共享. 在匹配过程中,正则表达式的编译形式不会改变,因此可以安全地使用相同的编译模式 一次. 如果使用了即时优化功能,则需要为每个线程提供单独的内存堆栈区域.请参阅PCREJIT文档 有关更多详细信息. 所有这些意味着,如果您小心,答案是"是,PCRE库是线程安全". 其他解决方案 有点偏离主题,但我建议您看看 re2 (RE2对线程友好)
我想在并行执行某些命令时将系统状态(例如内存加载或CPU加载)等.我可以在多个Python线程中使用一个Paramiko客户端,还是必须连接多个Paramiko客户端?我找不到有关Paramiko线程安全的任何文件. 感谢您的帮助, 托马斯 解决方案 paramiko不是线程安全. 一些相关问题: 是否有必要使用多线程中的Paramiko中的每个线程打开一个SftpClient? 如何防止我的应用在并行paramiko.sftpclient.get请求时挂起? 使用多个Connections/threads使用Python paramiko 上传大型文件/线程上传大文件
编辑介绍: 我们知道,C#中的REF参数将A Reference 传递到变量,从而使外部变量本身可以在一种称为方法中更改.但是,参考的处理方式很像C指针(读取对该参数的每个访问并更改原始变量,并将每个修改都更改为参数),或者可以依靠一致的参考电话的持续时间?前者提出了一些线程安全问题.特别是: 我已经在C#中写了静态方法,该方法通过参考传递对象: public static void Register(ref Definition newDefinition) { ... } 呼叫者提供了一个完整但尚未注册的Definition对象,在一致性检查之后,我们"注册"了他们提供的定义.但是,如果已经有一个具有相同键的定义,则无法注册新的键,而将其引用更新为"官方" Definition该密钥. 我们希望这是严格的线程安全性,但是想到了病理方案.假设客户端(使用我们的库)以非线程安全的方式共享参考,例如使用静态成员而不是本地变量: private static D
有人知道如何将多个参数传递到线程.启动例程吗? 我想到了扩展课程,但是C#线程类已密封. 这是我认为代码的样子: ... Thread standardTCPServerThread = new Thread(startSocketServerAsThread); standardServerThread.Start( orchestrator, initializeMemberBalance, arg, 60000); ... } static void startSocketServerAsThread(ServiceOrchestrator orchestrator, List memberBalances, string arg, int port) { startSocketServer(orchestrator, memberBalances, arg, port); } 顺便说一句,我用不同的编排,平衡和端口开始了许多
在delphi 10.1柏林,我想对TParallel.&For循环响应. 我的平行循环类似于所讨论的示例 tparallel.for":将其存储在tlist中时,将它们以tparallel的计算.用于循环.循环计算值并将这些值存储在A TList中. 我尝试在带有TTask.Run的单独线程中运行TParallel.&For以使其响应: type TCalculationProject=class(TObject) private Task: ITask; ... public List: TList; ... end; function TCalculationProject.CalculateListItem(const AIndex: Integer): Real; begin //a function which takes a lot of calculation time /